请问,有没有办法获取在Java中垃圾收集的对象(它们的变量或至少是类名)的历史记录?
只需添加这些参数(到Oracle JVM)
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
不以字节为单位提供任何其他内存。这对我来说是非常有限的帮助。感谢所有回复。
注意:添加finilize()方法的解决方法对我来说并不是一个不可取的选择(我无法访问它)。
答案 0 :(得分:4)
您可以使用finalize
中的Object
方法。当对象即将被GCed时调用此方法。从这里,您可以记录您需要的信息。
答案 1 :(得分:3)
免责声明:我的公司开发了我在此答案中推荐的工具。
在JProfiler中,您可以转到内存部分的“录制对象”视图,并将活动模式切换为垃圾回收对象(查看 - >更改实时模式 - >垃圾收集对象)。然后,您将看到已经GCed的对象的统计信息。
答案 2 :(得分:0)
你在寻找内存泄漏吗?
如果实现finalize()
方法(在每个Object
中都可用),它将在对象被垃圾收集之前调用 - 并且您可以在其中运行任何代码。
如果您正在寻找一个系统的解决方案(或者您无法访问要监控的类),我不知道有任何JVM选项允许这样做。但是可以记录正在加载和卸载的类(GCed),但这不是你要求的。
答案 3 :(得分:0)
Weak references或phantom references似乎对记录有用。在this article中解释了技术。
答案 4 :(得分:-2)
JDK中有一个很好的内置工具,用于在运行时观察jvm。这是jvisualvm。屏幕截图有一个很好的参考:http://visualvm.java.net/description.html
以下是其中一个:
希望有所帮助。