首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >System.gc()和死对象回收之间的区别是通过使用一个只有活动的堆转储来完成的?

System.gc()和死对象回收之间的区别是通过使用一个只有活动的堆转储来完成的?
EN

Stack Overflow用户
提问于 2010-11-11 16:08:51
回答 1查看 555关注 0票数 3

至少有两种方法可以直接或间接地建议JVM花费精力收集垃圾:

  • System.gc()
  • 获取堆转储并仅请求活动对象

在后者中,我可以通过编程方式持有堆转储,例如通过

代码语言:javascript
复制
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 .

EN

回答 1

Stack Overflow用户

发布于 2010-11-11 17:21:03

System.gc()可能没有那么咄咄逼人,因为它只是指示它应该运行GC。然后GC可以自由地决定它应该收集(查找和释放)所有已死的对象,其中一些对象等等。它可以确定以前的大集合发生得太近了,现在不是再次收集所有对象的时候了。

我相信,如果堆仍然是活着的,并且只显式地请求活的对象,那么GC就会为每个对象精确地计算。这部分收集工作正在完成,释放死对象所使用的内存也不需要太大的代价。

唉,我没有强有力的证据来证明这种行为,这与其说是一种真实的解释,不如说是一种疯狂的猜测。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4156470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档