当前位置: 首页 > 面试题库 >

我怎样才能弄清未释放对象的状态?

谈渊
2023-03-14
问题内容

我们的程序之一有时会OutOfMemory在一个用户的计算机上出现错误,但是当我测试它时当然不会出错。我只是用JProfiler(因为我从未使用过,所以使用了10天的评估许可证)运行了它,并过滤了我们的代码前缀,所以在总大小和实例数上最大的块是8000+个特定简单类的实例。

我单击了JProfiler上的“垃圾收集”按钮,大多数其他类的实例都消失了,但是这些特殊的实例却没有。我仍然在同一实例中再次运行测试,它创建了该类的4000多个实例,但是当我单击“垃圾收集”时,那些实例消失了,剩下了8000多个原始实例。

这些实例确实在各个阶段陷入了各种Collection中。我假设它们不是被垃圾收集的事实,这意味着某些内容正在保留对集合之一的引用,从而保留了对对象的引用。

关于如何找出参考的任何建议?我正在寻找有关在代码中查找内容的建议,以及在JProfiler中找到此内容的方法。


问题答案:

转储并检查堆。

我敢肯定有多种方法可以做到这一点,但这是一个简单的方法。此说明适用于MS Windows,但是可以在其他操作系统上执行类似的步骤。

  1. 如果尚未安装JDK,请安装它。它带有许多简洁的工具。
  2. 启动应用程序
  3. 打开任务管理器,然后找到java.exe(或正在使用的任何可执行文件)的进程ID(PID)。如果默认情况下未显示PID,请使用“视图”>“选择列…”添加它们。
  4. 使用 jmap 转储堆。
  5. 在生成的文件上启动 jhat 服务器,然后将浏览器打开到 http:// localhost:7000 (默认端口为7000)。现在,您可以浏览感兴趣的类型以及诸如实例数,引用实例的信息等信息。

这是一个例子:

C:\dump>jmap -dump:format=b,file=heap.bin 3552

C:\dump>jhat heap.bin
Reading from heap.bin...
Dump file created Tue Sep 30 19:46:23 BST 2008
Snapshot read, resolving...
Resolving 35484 objects...
Chasing references, expect 7 dots.......
Eliminating duplicate references.......
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

为了解释这一点,了解Java使用的某些数组类型命名法很有用-
例如知道 该类[Ljava.lang.Object; 实际上是指 Object [] 类型的 对象



 类似资料:
  • 问题内容: 这是一个简单的ArrayList排序程序: 我期望该程序的输出为: 但是当我运行该程序时,我得到的输出为: 为什么会这样?如何使ArrayList进行排序,如预期输出所示? 问题答案: 您可以编写一个自定义比较器:

  • 有什么方法可以简化这段代码吗?我正好有一个白色的一块,想要得到它的位置 代码: 瓦片类: 件类:

  • 问题内容: 我试图“ stopPropagation”以防止单击li内的元素(链接)时关闭TwitterBootstrap导航栏下拉菜单。 在Angular中,看起来像指令是执行此操作的地方?所以我有: …但是该方法不属于元素: 我把指令与 有什么建议么? 问题答案: “当前一些指令(即ng:click)停止事件传播。这阻止了与依赖于捕获此类事件的其他框架的互操作性。” - …并且能够在没有指令的

  • 所以我试图将重力添加到4个UIButton,但它们没有下降,我将此代码添加到视图中并加载,我不知道为什么这不起作用。这是代码: 我的按钮有红色按钮、绿色按钮、蓝色按钮和相机按钮,我也应用了秋天的方向,但当我运行应用程序时,它们只是静态的。那么,有没有可能给这些按钮增加重力呢?

  • 在使用不同的验证器调用不同的rpc方法之前,我需要验证请求。 所以我实现了如下验证器 并在我的rpc方法之前添加自定义注释 但是我发现我在gRPC ServerInterceptor中找不到获取注释信息的方法。有没有办法像这样实现grpc请求验证?

  • 环境:Akka 2.1,scala版本2.10。M6,JDK 1.7,u5 现在是我的问题:我有: 现在在第一行中,我有一个对象的未来,有没有办法在不阻塞当前线程的情况下将其转换为未来? akka有什么方法吗?据我所知,我还没有找到...第一次发帖....抱歉,格式和组织不正确...:~P