我需要一个干净的实时对象堆转储。我目前正在使用HotSpotDiagnosticMXBean
来进行堆转储:
final String DIAGNOSTIC_MBEAN_NAME = "com.sun.management:type=HotSpotDiagnostic";
final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
diagnosticMBean = ManagementFactory.newPlatformMXBeanProxy(server, DIAGNOSTIC_MBEAN_NAME, HotSpotDiagnosticMXBean.class);
diagnosticMBean.dumpHeap(fileName, true);
此方法首先通过调用完整的GC来获取活动对象。但是,偶尔,当我在YourKit中分析堆转储时,我注意到很多无法访问的java.lang.Object
具有“Pending Finalization”注释。我不希望它们显示在堆转储中。
我的问题是,我应该在System.runFinalization()
之前明确地调用diagnosticMBean.dumpHeap(fileName, true)
,还是完整的GC已经暗示了这一点?在后一种情况下,我如何知道所有无法到达的对象是否已经完成?睡10秒钟就够了吗?
谢谢!