Garbage collection 为什么JVM完整GC需要停止这个世界?

Garbage collection 为什么JVM完整GC需要停止这个世界?,garbage-collection,jvm,Garbage Collection,Jvm,我认为这是因为JVM需要移动对象,对吗?stop world保证不会分配新对象,并且在收集器运行时不会突然无法访问对象 它的优点是实现起来更简单,而且比增量垃圾收集更快。首先,它是非常好的读物 一般来说,GC不需要停止世界暂停。 有一些JVM实现是(几乎)无暂停的(例如)。JVM何时需要STW收集垃圾取决于它使用的算法 标记扫描压缩(MSC)默认情况下是热点中使用的流行算法。它以STW方式实施,分为3个阶段: 标记-遍历活动对象图以标记可访问对象 扫描-扫描内存以查找未标记的内存 压缩-重新定

我认为这是因为JVM需要移动对象,对吗?

stop world保证不会分配新对象,并且在收集器运行时不会突然无法访问对象

它的优点是实现起来更简单,而且比增量垃圾收集更快。

首先,它是非常好的读物

一般来说,GC不需要停止世界暂停。 有一些JVM实现是(几乎)无暂停的(例如)。JVM何时需要STW收集垃圾取决于它使用的算法

标记扫描压缩(MSC)默认情况下是热点中使用的流行算法。它以STW方式实施,分为3个阶段:

  • 标记-遍历活动对象图以标记可访问对象
  • 扫描-扫描内存以查找未标记的内存
  • 压缩-重新定位标记的对象以对可用内存进行碎片整理
当在堆中重新定位对象时,JVM应该更正对该对象的所有引用。在重新定位过程中,对象图不一致,因此需要STW暂停

并发标记扫描(CMS)是HotSpot JVM中的另一种算法,它不利用STW暂停进行旧空间收集(与完全收集不完全相同)

CMS利用写屏障(每次在Java堆中写入引用时触发)来实现MARK的并发版本,而不使用COMPACT。缺少压缩可能会导致碎片,如果后台垃圾收集速度不够快,应用程序仍可能被阻塞。在这些情况下,CMS将退回到STW标记扫描压缩集合


还有G1,这是MSC的增量变化。您可以在我的博客中阅读更多信息。

使用吞吐量GC,JVM需要STW暂停以释放尽可能多的内存。只有这样的停顿才是最有效的

使用low pauses collector(CMS),可以在不暂停应用程序的情况下同时清理旧一代。缺点是老一代变得支离破碎。如果它太零碎并且需要压缩,则会发生完全GC(STW)。但是,您可以随时调整应用程序,这样就不会得到任何完整的GC


g1gc是一个特例。它当前的主要目标是在堆上有一个较低的碎片,同时仍然是并发的(如CMS)。当JVM无法达到这一目标时,它也会恢复到STW暂停,以便堆被完全清理和压缩。

在几乎任何垃圾收集方案中,甚至在大多数最小化暂停的方案中,都需要短暂停止world阶段来扫描堆栈上的引用。非常详细的解释。 增量和并发算法努力将这些暂停降至最低,但在大多数情况下仍然存在这些暂停


实际上,甚至还有一些移动/压缩方法,在移动对象时不需要停止世界(我想到了断开)

从wikipedia页面查看垃圾收集对象在GC将其标记为可访问后变得不可访问并不是什么大问题。这是正确的,并且只延迟一个GC周期的内存回收。一个更严重的问题是在GC期间分配新对象,并且在已经访问过的对象中存储唯一的引用——然后错误地回收对象。然而,这不是一个无法解决的问题。事实上,这个问题从70年代就已经解决了。由于RedHat的存在,此后又出现了另一个GC algrogithm。根据此Oracle页面,CMS收集器在并发收集周期中暂停应用程序两次,包括初始标记暂停和备注暂停。如果碎片太多,没有足够的块,将导致第三次暂停。