jep122
一项新的Java增强建议(JEP)旨在对ZGC的堆栈处理进行一些更改。 过去,垃圾回收已在HotSpot中引起暂停和可伸缩性问题,这就是为什么不再使用安全点的原因。 这些安全点在运行程序时会导致短暂但明显的暂停(在较大的计算机上可能会明显增加),因为正在检查堆以确保其一致性。 结果,在开始垃圾收集之前,一切都停了片刻–这当然是不希望的。
Java未来版本的最终目标是,垃圾回收应与程序流完全同时运行,从而将中断降到最低甚至没有中断。 这意味着摆脱GC暂停的时刻,例如在安全点。 迄今为止,已经进行了改进,从而在减少暂停时间方面取得了很大进展。 标记,重定位,参考处理,类卸载和根处理已被删除,ZGC可以并发运行之前唯一需要调整的就是堆栈处理。 那就是JEP 376出现的地方。
JEP 376的主要目的是从ZGC安全点转移线程堆栈处理。 此外,它旨在使堆栈处理变得惰性,协作,并发和增量,并从ZGC安全点中删除所有其他每线程根处理。 JEP还指出,目标不是实现非GC安全点操作(例如类重定义)的并发每线程处理。
还请参见:
JEP所有者ErikÖsterlund写道:
ZGC垃圾收集器(GC)旨在使HotSpot中的GC暂停和可伸缩性问题成为过去。 到目前为止,我们已经将所有根据堆大小和元空间大小扩展的GC操作从安全点操作中移出并发到并发阶段。 这些包括标记,重定位,参考处理,类卸载和大多数根处理。
在GC安全点中唯一仍进行的活动是根处理和有时限的标记终止操作的子集。 这些根包括Java线程堆栈和各种其他线程根。 这些根是有问题的,因为它们随线程数扩展。 在大型计算机上有许多线程时,根处理成为一个问题。
为了超越今天的范围,并满足在GC安全点内花费的时间不超过一毫秒的期望,即使在大型计算机上,我们也必须将包括堆栈扫描在内的每线程处理移到并发相。
还请参见:
一旦实施了JEP 376的工作,在ZGC安全点操作内部将不会做任何重要的事情。 此外,这项工作可能会为其他项目提供一个平台,以统一惰性堆栈处理。 例如,Loom和JFR项目可能会受益。
在此处阅读有关JEP 376的更多信息,并在此处了解最新的Java 15新闻 。
翻译自: https://jaxenter.com/jep-376-zgc-concurrent-thread-stack-processing-171364.html
jep122