调用System.gc()请求进行垃圾收集,但不保证。关于它不受保证的部分对我来说很有趣:有人可以解释你打电话时发生的确切过程吗?
答案 0 :(得分:2)
无法保证会发生垃圾收集,因为无法保证JVM支持垃圾收集(我不相信它在JLS中提到过,当然不在index中)
然而,我认为这种“不保证”的信念有点错位。来自太阳API docs:
当控制从方法返回时 调用,Java虚拟机有 尽最大努力收回空间 来自所有丢弃的物品。
好的,所以也许不能保证,但是这表明当你调用这个方法时,普通的JVM实际上会启动一个GC循环。也许一些JVM不会,也许一些未来的垃圾收集器不会,但是现在,它做了广告宣传。
当然,也就是说,应用程序代码几乎从来没有理由调用此方法。 JVM会在需要时收集垃圾。
答案 1 :(得分:1)
确切的过程是特定于JVM的,实际上是一个正在进行大量研究的领域。这是可能的,因为规范对实际应该发生的事情是如此模糊。
最初Java有一个“停止一切,看看每个对象,看看哪些还活着”。这很慢,2)在发生这种情况时停止了所有事情。
今天,基于Sun的JVM有几个对象池,因为大多数对象不会长寿,所以通过保持单独的池可以避免很多工作。
关于如何在java 5中调整gc的太阳能文档对于发生的事情非常有启发性:
答案 2 :(得分:1)
确切的过程取决于JVM的版本和供应商。
有不同的算法 - 标记和扫描,世代等。通常它们以并行线程运行。
JVM可以调用System.gc()
disabled,因此无法保证一个很好的理由。 IBM的Java theory and practice: Garbage collection and performance更多地讨论了这一点,并解释了为什么帮助 GC显而易见的事实上伤害性能。它还解释了许多用于实现GC的算法。
Sun还在Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning中描述了各种GC实现。