0

根据 IBM 链接(https://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/openj9/xgcpolicy/index.html),可以通过 -Xgcpolicy 设置来指定 gc 策略。默认 gcpolicy 是 gencon (-Xgcpolicy:gencon)。WAS 是 9.0,JVM 是 IBM J9(Java 版本 1.8)。接下来,从 IBM 的以下链接看来,使用标志 -XX 也可以设置 gc 算法,就像在其他 JVM 中一样。例如:-XX:+UseG1GC 可以工作。 https://www.ibm.com/support/knowledgecenter/en/SS3KLZ/com.ibm.java.diagnostics.visualizer.doc/verbosegc.html

我的意图是应用像 UseG1GC 这样的 gc 行为。堆大小为 -Xms16G 到 -Xmx20G。所以,我希望首先使用 Garbase 和并发,即 UseG1GC。-Xgcpolicy:gencon 也有点类似,但它会导致“停止世界”。当 gc 运行时,应用程序会暂停。有点困惑的是,即使我设置了 -XX:+UseG1GC,它会遵循并有效 UseG1GC 行为还是遵循 -Xgcpolicy:gencon 的机制?还是 gcpolicy 和 gc 算法是两个不同的东西?

4

1 回答 1

1

在 IBM JVM 上使用 -XX:+UseG1GC 没有效果。它只会被无声地吞噬。JVM 将默认使用 Gencon GC 策略。

您可以通过运行 -verbose:gc 来验证将报告正在使用的 GC 策略。

与 Hotspot 的 G1GC 最接近的 IBM GC 策略是 Balanced 策略,主要区别在于它们是基于区域的(不像 Gencon 有两个不同的堆区域用于新旧对象)。

就并发而言,所有 3 个(G1GC、Balanced、Gencon)都是相似的:全局 GC 大多是并发的,部分/本地 GC 是 STW(Stop-The-World)。

使用基于区域的 GC 策略的原因是减少最坏情况下的暂停时间。它们能够在部分 GC 中增量地执行一些全局类型操作。最值得注意的是,与 Gencon 不同,它们可以通过可选的 STW 紧凑操作在全局 GC 中逐步对堆进行碎片整理。大多数应用程序不需要这种全局压缩,因此 Gencon 是默认设置。但是,如果在 Gencon 运行中观察到由于全局压缩导致的长时间停顿,则应尝试使用平衡。然而,平衡 GC 会稍微影响应用程序的吞吐量。

于 2021-02-03T14:58:48.173 回答