如何查看Java中垃圾收集的对象?

时间:2011-09-21 10:15:31

标签: java garbage-collection

请问,有没有办法获取在Java中垃圾收集的对象(它们的变量或至少是类名)的历史记录?

只需添加这些参数(到Oracle JVM)

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

不以字节为单位提供任何其他内存。这对我来说是非常有限的帮助。感谢所有回复。

注意:添加finilize()方法的解决方法对我来说并不是一个不可取的选择(我无法访问它)。

5 个答案:

答案 0 :(得分:4)

您可以使用finalize中的Object方法。当对象即将被GCed时调用此方法。从这里,您可以记录您需要的信息。

答案 1 :(得分:3)

免责声明:我的公司开发了我在此答案中推荐的工具。

JProfiler中,您可以转到内存部分的“录制对象”视图,并将活动模式切换为垃圾回收对象(查看 - >更改实时模式 - >垃圾收集对象)。然后,您将看到已经GCed的对象的统计信息。

enter image description here

答案 2 :(得分:0)

你在寻找内存泄漏吗?

如果实现finalize()方法(在每个Object中都可用),它将在对象被垃圾收集之前调用 - 并且您可以在其中运行任何代码。

如果您正在寻找一个系统的解决方案(或者您无法访问要监控的类),我不知道有任何JVM选项允许这样做。但是可以记录正在加载和卸载的类(GCed),但这不是你要求的。

答案 3 :(得分:0)

当对象实际被删除时,

Weak referencesphantom references似乎对记录有用。在this article中解释了技术。

答案 4 :(得分:-2)

JDK中有一个很好的内置工具,用于在运行时观察jvm。这是jvisualvm。屏幕截图有一个很好的参考:http://visualvm.java.net/description.html

以下是其中一个: enter image description here

希望有所帮助。