【问题标题】:Tuning G1GC params for aggressive garbage collection?为积极的垃圾收集调整 G1GC 参数?
【发布时间】:2018-12-25 10:34:22
【问题描述】:

我的 JVM 基本上是一个 spark 执行器,它一个接一个地运行任务。任务需要大量内存,并且在其生命周期中需要大量内存。

JConsole and JVisualVM report side by side

上面的 JVM 在 G1GC 上运行,默认参数。正如您在下午 4:25 到 4:32 之间右侧的 VisualVM 报告中看到的那样,峰值是由于执行器运行的每个任务造成的(本质上,每个峰值是由于执行器在上一篇完结了)。当我在 4:35 触发手动 GC 时,我看到堆使用量急剧下降。此外,正如您在 JConsole 报告的左侧看到的那样,G1GC 从未收集过 old gen 空间(16:35 之前的 old gen 空间急剧下降是由于手动 GC)。

由于我的应用程序是一个 spark 批处理作业应用程序,如果 JVM 花费大量时间进行 GC,我可以。但是,我的记忆力有点不足。所以,我想知道如何调整我的 JVM G1GC 参数,以便有更频繁的 GC(旧的 gen 空间也被收集),并且我可以用相当少的堆空间 (XMX) 来完成工作。

【问题讨论】:

  • 你检查过这个吗:https://www.oracle.com/technetwork/articles/java/g1gc-1984535.html#Taming
  • 我尝试更改 -XX:InitiatingHeapOccupancyPercent 。我尝试使用 0、5、10。降低该值,GC 更频繁,消耗的 CPU 也更多,但行为并不一致。一段时间后,堆使用率会飙升,如果我们将 XMX 值设置为小于上图中的值(6 GB),则会抛出 OOM

标签: java apache-spark garbage-collection g1gc


【解决方案1】:

对于 G1,及时将未使用的内存返回给操作系统是 OpenJDK 12 的一项功能:

如果您的内存不足,您可能需要控制 RSS(从操作系统分配的总内存),而不仅仅是 Java 堆中使用的内存。在当前 OpenJDK 中使用 G1,(半)手动触发的完整 GC 似乎是触发 RSS 减少的唯一方法。 (如果您更改频繁发生完整 GC 的人体工程学,G1 将表现不佳。)

如果您的 OpenJDK 构建包含 Shenondoah collector,如果您需要节省内存,尤其是在进行一些调整(例如使用 -XX:ShenandoahGCHeuristics=compact)时,它可能是更好的选择。

ZGC 最终应该也支持返回内存,但是it currently does not; patch adding an -XX:+ZReleaseUnusedHeap option 尚未合并。

【讨论】:

  • ShenandoahGCHeuristics 将毫无延迟地执行背靠背 GC 调用,至少还应启用 ShenandoahAllocationThreshold
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多