2017-06-14 64 views
0

在基于wildfly和infinispan的内存中应用程序上工作时,我们遇到了IBM Java实现(在AIX上)的问题。如何避免垃圾回收在IBM Java/JVM中停止世界事件

在Oracle中,引入了新的策略G1垃圾收集,以避免在完整GC期间长时间垃圾收集停止JVM。据我所知,IBM在他们的Java实现中没有实现这个策略。那么如何处理IBM Java上的大型堆在线应用程序,特别是如何避免或至少最小化停止世界的垃圾回收。

感谢,BR克劳斯

+0

Afaik IBM Jvms提供多种不同的GC,就像OpenJDK一样。你检查过他们的文件吗? – the8472

+0

是的,我有。但即使使用-Xgcpolicy:optavgpause,JVM正在oracle jvm中的停止世界事件 – klaussp

+0

中运行,可以通过使用像-XX:MaxGCPauseMillis = 200这样的参数来尽量减少暂停时间。我找不到IBM提供这样的东西...... – klaussp

回答

0

的G1收集执行老根的增量收集(和压缩)。堆空间。但是,如果它无法跟上年轻人的晋升速度。它将采取一个完全停止世界压缩集合,所以你仍然可以看到G1的延迟(暂停)的重大峰值。 G1将堆空间划分为区域,因此年轻人和老年人都成为记忆的逻辑区域(每个区域都是一组区域),而不是连续的虚拟记忆区域。通过这样做,区域可以彼此独立处理,而活动对象较少的区域优先于区域较多的区域以提高收集效率。

IBM对OpenJDK中提供的策略有不同的策略(以及来自Oracle的Hotspot)。有两个你应该看看:gencon,这是一个并发标记扫描算法,和节拍器,它被设计成一个更实时的收集器。节拍器只支持Linux,但是。即使这会回落到完整的STW收集,所以在极端情况下可能会有明显的停顿。

不幸的是,在AIX上,gencon是最小化暂停时间的最佳选择。由于这是一代代收集器,您可以通过减少代码生成的长寿命对象的数量来减少暂停时间。这样一来,这些物品就会在小集合中收集起来,而不会被提升到旧的。这是主要收藏品(旧有的),会导致更长的停顿时间。