至少有两种方法可以直接或间接地建议JVM花费精力收集垃圾:
System.gc()在后者中,我可以通过编程方式持有堆转储,例如通过
hotspotMBean = ManagementFactory.newPlatformMXBeanProxy(ManagementFactory.getPlatformMBeanServer(), "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
hotspotMBean.dumpHeap(filename, live);如果有什么不同,这两个操作将如何收集不可强可达的对象?
我相信我有证据表明,在弱引用、RMI分布式垃圾收集和System.gc()组合的情况下,堆转储方法比不可见的对象--可以从堆栈中获得。更具侵略性。特别是,仅在本地弱可访问并已成为相对于RMI的Unreferenced的对象似乎仅由堆转储收集。我还没能把它提炼成一个小的测试用例,但是它是可重复的。
(在警告我不要依赖prod代码中的特定GC行为之前,我没有。我在调查潜在的内存泄漏时发现了这一点,并注意到结果随堆转储时间的不同而变化。我只是好奇。)
这是在Windows 7上使用HotSpot 64位服务器VM 1.6.0_22 .
发布于 2010-11-11 17:21:03
System.gc()可能没有那么咄咄逼人,因为它只是指示它应该运行GC。然后GC可以自由地决定它应该收集(查找和释放)所有已死的对象,其中一些对象等等。它可以确定以前的大集合发生得太近了,现在不是再次收集所有对象的时候了。
我相信,如果堆仍然是活着的,并且只显式地请求活的对象,那么GC就会为每个对象精确地计算。这部分收集工作正在完成,释放死对象所使用的内存也不需要太大的代价。
唉,我没有强有力的证据来证明这种行为,这与其说是一种真实的解释,不如说是一种疯狂的猜测。
https://stackoverflow.com/questions/4156470
复制相似问题