Garbage collection 为什么JVM完整GC需要停止这个世界?
我认为这是因为JVM需要移动对象,对吗?stop world保证不会分配新对象,并且在收集器运行时不会突然无法访问对象 它的优点是实现起来更简单,而且比增量垃圾收集更快。首先,它是非常好的读物 一般来说,GC不需要停止世界暂停。 有一些JVM实现是(几乎)无暂停的(例如)。JVM何时需要STW收集垃圾取决于它使用的算法 标记扫描压缩(MSC)默认情况下是热点中使用的流行算法。它以STW方式实施,分为3个阶段:Garbage collection 为什么JVM完整GC需要停止这个世界?,garbage-collection,jvm,Garbage Collection,Jvm,我认为这是因为JVM需要移动对象,对吗?stop world保证不会分配新对象,并且在收集器运行时不会突然无法访问对象 它的优点是实现起来更简单,而且比增量垃圾收集更快。首先,它是非常好的读物 一般来说,GC不需要停止世界暂停。 有一些JVM实现是(几乎)无暂停的(例如)。JVM何时需要STW收集垃圾取决于它使用的算法 标记扫描压缩(MSC)默认情况下是热点中使用的流行算法。它以STW方式实施,分为3个阶段: 标记-遍历活动对象图以标记可访问对象 扫描-扫描内存以查找未标记的内存 压缩-重新定
- 标记-遍历活动对象图以标记可访问对象
- 扫描-扫描内存以查找未标记的内存
- 压缩-重新定位标记的对象以对可用内存进行碎片整理
还有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收集器在并发收集周期中暂停应用程序两次,包括初始标记暂停和备注暂停。如果碎片太多,没有足够的块,将导致第三次暂停。