【发布时间】:2009-07-05 12:02:09
【问题描述】:
调用 System.gc() 请求进行垃圾收集,但不能保证。关于无法保证的部分对我来说很有趣:有人可以解释您拨打此电话时发生的确切过程吗?
【问题讨论】:
调用 System.gc() 请求进行垃圾收集,但不能保证。关于无法保证的部分对我来说很有趣:有人可以解释您拨打此电话时发生的确切过程吗?
【问题讨论】:
【讨论】:
确切的过程是特定于 JVM 的,实际上是一个正在进行大量研究的领域。这是可能的,因为规范对实际应该发生的事情非常模糊。
最初,Java 有一个“停止一切并查看每个对象以查看哪些还活着”。这是 1) 缓慢和 2) 在发生这种情况时停止了一切。
今天,基于 Sun 的 JVM 有多个对象池,因为大多数对象的寿命不长,因此通过保持单独的池可以避免很多工作。
Suns 关于如何在 java 5 中调整 gc 的文档对发生的事情很有指导意义:
【讨论】:
具体过程取决于 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 实现。
【讨论】: