我的JVM基本上是一个火花执行器,它一个接一个地运行任务。任务需要内存,在其生命周期内需要大量内存。
上面的JVM运行在具有默认参数的G1GC上。正如您在右侧的VisualVM报告中所看到的,下午4:25到4:32之间的尖峰是由执行器运行的每个任务造成的(本质上,每个尖峰都是由于执行者在完成上一个任务之后选择了新任务)。当我在4:35触发手动GC时,我看到堆使用量急剧下降。另外,正如您在JConsole报告的左侧所看到的那样,G1GC从未收集过旧的gen空间( 16:35之前,旧的gen空间急剧下降是由于手动GC)。
因为我的应用程序是一个火花批次作业申请,所以如果JVM花费了大量的时间来执行GC,我是可以的。但是,我的记忆力有点不足。因此,我想知道如何调优我的JVM G1GC参数,以便有更频繁的GC (旧的gen空间也被收集),并且我可以使用相当多的堆空间(XMX)来完成工作。
发布于 2019-01-06 12:20:36
对于G1,及时将未使用的内存返回到操作系统是OpenJDK 12的一个特性:
如果内存不足,很可能需要控制RSS (从操作系统分配的总内存),而不仅仅是Java堆中使用的内存。在当前的G1中,(半)手动触发完整的OpenJDK似乎是触发RSS减少的唯一方法。(如果您更改完整GC频繁发生的人机工程学,G1的性能将很差。)
如果您的OpenJDK构建包含神农多收藏家,那么如果您需要节省内存,特别是通过一些调优(例如使用-XX:ShenandoahGCHeuristics=compact ),这可能是一个更好的选择。
https://stackoverflow.com/questions/53921518
复制相似问题