在infinispan上使用基于wildfly的内存中应用程序,我们面临着IBM Java实现的问题(在AIX上)。
在Oracle中引入了新策略G1垃圾收集,以避免在全GC期间停止JVM的长时间垃圾收集。据我所知,IBM并没有在他们的Java实现中实现这个策略。那么如何处理IBM Java上的大堆在线应用程序,特别是如何避免或至少最小化世界上的垃圾收集。
谢谢,BR克劳斯
答案 0 :(得分:1)
G1收集器执行旧版的增量收集(和压缩)。堆空间。但是,如果它无法跟上年轻人的晋升率。它将采用完全停止的世界压缩系列,因此您仍然可以看到G1的延迟(暂停)显着高峰。 G1将堆空间划分为多个区域,以便年轻和老一代成为内存的逻辑区域(每个区域都是一组区域),而不是虚拟内存的连续区域。通过这样做,区域可以彼此独立地处理,而那些具有较少活动对象的区域优先于那些区域,以提高收集效率。
IBM与OpenJDK(以及Oracle的Hotspot)提供的策略不同。你应该看两个:gencon,它是一个并发标记扫描算法,和节拍器,它被设计成一个更实时的收集器。但是,Metronome仅在Linux上受支持。即使这样也会回归到完整的STW系列,因此在极端情况下可能会有很长的停顿。
不幸的是,在AIX上,gencon是最小化暂停时间的最佳选择。由于这是一个分代收集器,因此可以通过最小化代码生成的长寿命对象的数量来减少暂停时间。这样,在次要收集期间收集对象,并且不会升级到旧版本。它是(旧版本的)主要收藏品会导致更长的停顿。