Java 调用System.gc()时,幕后到底发生了什么?

Java 调用System.gc()时,幕后到底发生了什么?,java,garbage-collection,Java,Garbage Collection,调用System.gc()请求进行垃圾收集,但不能保证。我很感兴趣的是关于它没有得到保证的部分:有人能解释一下你打这个电话时发生的确切过程吗?确切的过程是特定于JVM的,实际上这是一个正在进行大量研究的领域。这是可能的,因为规范对实际应该发生的事情非常模糊 最初,Java有一个“停止一切,查看每个对象,看看哪些对象还活着”。这是1)缓慢和2)停止一切,而这一切发生了 今天,基于Sun的JVM有几个对象池,因为大多数对象的寿命都不长,所以通过保持这些独立的池,可以避免很多工作 Suns关于如何在j

调用System.gc()请求进行垃圾收集,但不能保证。我很感兴趣的是关于它没有得到保证的部分:有人能解释一下你打这个电话时发生的确切过程吗?

确切的过程是特定于JVM的,实际上这是一个正在进行大量研究的领域。这是可能的,因为规范对实际应该发生的事情非常模糊

最初,Java有一个“停止一切,查看每个对象,看看哪些对象还活着”。这是1)缓慢和2)停止一切,而这一切发生了

今天,基于Sun的JVM有几个对象池,因为大多数对象的寿命都不长,所以通过保持这些独立的池,可以避免很多工作

Suns关于如何在java 5中调整gc的文档对接下来的工作非常有指导意义:


确切的过程是JVM特有的,实际上这是一个正在进行大量研究的领域。这是可能的,因为规范对实际应该发生的事情非常模糊

最初,Java有一个“停止一切,查看每个对象,看看哪些对象还活着”。这是1)缓慢和2)停止一切,而这一切发生了

今天,基于Sun的JVM有几个对象池,因为大多数对象的寿命都不长,所以通过保持这些独立的池,可以避免很多工作

Suns关于如何在java 5中调整gc的文档对接下来的工作非常有指导意义:


无法保证会进行垃圾收集,因为无法保证JVM支持垃圾收集(我认为JLS中根本没有提到垃圾收集,当然也没有提到

然而,我认为这种“不能保证”的观点有点错位。来自太阳:

当控件从方法返回时 调用时,Java虚拟机已 尽最大努力回收空间 从所有丢弃的对象中删除

好的,所以可能不能保证,但这向我表明,当您调用这个方法时,一个普通的JVM实际上会启动一个GC循环。也许有些JVM不会,也许未来的垃圾收集器也不会,但现在,它做的是宣传的事情


当然,也就是说,应用程序代码几乎没有理由调用此方法。JVM将在需要时收集垃圾。

无法保证会进行垃圾收集,因为无法保证JVM支持垃圾收集(我认为JLS中根本没有提到垃圾收集,当然也没有提到)

然而,我认为这种“不能保证”的观点有点错位。来自太阳:

当控件从方法返回时 调用时,Java虚拟机已 尽最大努力回收空间 从所有丢弃的对象中删除

好的,所以可能不能保证,但这向我表明,当您调用这个方法时,一个普通的JVM实际上会启动一个GC循环。也许有些JVM不会,也许未来的垃圾收集器也不会,但现在,它做的是宣传的事情


当然,也就是说,应用程序代码几乎没有理由调用此方法。JVM将在需要时收集垃圾。

具体过程取决于JVM的版本和供应商

有不同的算法-标记和扫描、分代等。它们通常在并行线程中运行

JVM可以调用
System.gc()
,因此这是一个很好的理由,但不能保证。IBM更多地讨论了这一点,并解释了为什么看似显而易见的帮助GC的方法实际上会损害性能。它还解释了用于实现GC的许多算法


Sun还在中描述了各种GC实现。

确切的过程取决于JVM的版本和供应商

有不同的算法-标记和扫描、分代等。它们通常在并行线程中运行

JVM可以调用
System.gc()
,因此这是一个很好的理由,但不能保证。IBM更多地讨论了这一点,并解释了为什么看似显而易见的帮助GC的方法实际上会损害性能。它还解释了用于实现GC的许多算法

Sun还在规范中描述了他们的各种GC实现。

在规范中,“最大努力”可能被解释为根本没有特别努力。在规范中,“最大努力”可能被解释为根本没有特别努力。