我的 JVM 基本上是一个 Spark 执行器,它一个接一个地运行任务。任务需要大量内存,并且在其生命周期内需要大量内存。
JConsole 和 JVisualVM 并排报告 https://i.stack.imgur.com/seZNO.png
上面的 JVM 使用默认参数在 G1GC 上运行。正如您在右侧的 VisualVM 报告中下午 4:25 到 4:32 之间看到的那样,峰值是由于执行程序运行的每个任务造成的(本质上,每个峰值是由于执行程序在上一篇已完结)。当我在 4:35 触发手动 GC 时,我看到堆使用率急剧下降。此外,正如您在 JConsole 报告的左侧看到的那样,旧代空间从未被 G1GC 收集(旧代空间在 16:35 之前急剧下降是由于手动 GC)。
由于我的应用程序是 Spark 批处理作业应用程序,因此如果 JVM 花费大量时间进行 GC,我就可以接受。但是,我的内存有点不足。因此,我想知道如何调整 JVM G1GC 参数,以便有更频繁的 GC(旧的 gen 空间也被收集),并且我可以用相当少的堆空间 (XMX) 来完成工作。
对于 G1,及时将未使用的内存返回给操作系统是 OpenJDK 12 的一项功能:
-
JEP 346:立即从 G1 返回未使用的提交内存 https://openjdk.java.net/jeps/346 (追踪问题) https://bugs.openjdk.java.net/browse/JDK-8204089
如果内存不足,您可能需要控制 RSS(从操作系统分配的总内存),而不仅仅是 Java 堆中已使用的内存。对于当前 OpenJDK 中的 G1,(半)手动触发的完整 GC 似乎是触发 RSS 减少的唯一方法。 (如果改变频繁发生完整GC的人体工程学,G1的性能会很差。)
如果您的 OpenJDK 版本包含雪兰多收藏家 https://wiki.openjdk.java.net/display/shenandoah/Main,如果您需要节省内存,特别是进行一些调整,例如使用-XX:ShenandoahGCHeuristics=compact
.
ZGC https://wiki.openjdk.java.net/display/zgc/Main最终也应该支持返回内存,但是目前还没有 http://mail.openjdk.java.net/pipermail/zgc-dev/2018-October/000489.html; the 补丁添加一个-XX:+ZReleaseUnusedHeap option http://cr.openjdk.java.net/~pliden/zgc/zrelease_unused_heap/webrev.0/尚未合并。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)