如何避免垃圾收集 Stop the World Events in IBM Java/JVM

How to avoid garbage collection Stop the World Events in IBM Java/JVM

使用 infinispan 开发基于 wildfly 的内存应用程序,我们面临 IBM Java 实现(在 AIX 上)的问题。

在 Oracle 中引入了新策略 G1 垃圾收集,以避免长时间垃圾收集在 full-GC 期间停止 JVM。据我所知,IBM 并未在其 Java 实施中实施此策略。那么如何处理 IBM 上的大型堆在线应用程序 Java,尤其是如何避免或至少最小化 stop-the-world 垃圾收集。

谢谢,BR克劳斯

G1 收集器对老一代执行增量 collection(和压缩)。堆space。但是,如果跟不上年轻一代的晋升速度。它将求助于完全 stop-the-world 压缩 collection,因此您仍然可以看到 G1 的延迟(暂停)出现显着峰值。 G1 将堆 space 划分为区域,因此新生代和老年代成为内存的逻辑区域(每个区域都是一组区域),而不是虚拟内存的连续区域。通过这样做,区域可以相互独立地处理,并且活动 objects 较少的区域优先于活动较多的区域,以提高 collection 效率。

IBM 与 OpenJDK(以及 Oracle 的 Hotspot)中提供的策略不同。有两个您应该关注:gencon,它是一种并发标记清除算法,以及 metronome,它被设计成一个更加实时的收集器。但是,节拍器仅在 Linux 上受支持。即使这样也会回退到完整的 STW collection,因此在极端情况下可能会有明显的停顿。

不幸的是,在 AIX 上,gencon 是最小化暂停时间的最佳选择。由于这是分代收集器,您可以通过最小化代码生成的 long-lived objects 的数量来减少暂停时间。这样 objects 会在未成年人 collection 期间被收集,并且不会提升到老一代。这是主要的 collections(旧一代)会导致更长的停顿。