【发布时间】: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