“堆大小”的增长速度比“已用堆”快得多

问题描述 投票:0回答:1
我的java应用程序的

Heap size

不断增长,直到达到
Max Heap size
1G
。为什么会这样?

我用这些参数开始我的应用程序:

java -Xmx1G -XX:+UnlockExperimentalVMOptions \ -XX:+UseShenandoahGC -XX:ShenandoahUncommitDelay=5000 \ -XX:ShenandoahGuaranteedGCInterval=10000 - \ Dlog4j.configurationFile=./log4j2.xml \ -jar application.jar

Difference of Heap size and Used heap is grwoing

编辑: 当我重新启动应用程序时,您会看到“堆大小”和“已用堆”之间没有差距,但这个差距越来越大,我可以以某种方式限制这个差距吗?

enter image description here

java garbage-collection heap-memory visualvm
1个回答
2
投票
我不太熟悉新 Shenandoah GC 的正常运行方式。然而,该图(对我来说)并没有什么特别令人担忧的地方。

根据

https://shipilev.net/talks/devoxx-Nov2017-shenandoah.pdf,此 GC 在内存利用率方面的 操作方式 (MO) 与其他一些收集器有点不同。

“当我们需要时,我们将拿走所有内存,但当我们不需要时,我们也将归还它”。

如果分配器上有很大的负载(即分配了很多对象),Shenandoah 将积极扩展堆。这是基于这样的观察:如果有足够的工作空间,低暂停 GC 是最高效的(并且最有可能跟上!)。

但另一方面,如果您的系统空闲,GC 会比许多其他 GC 更自由地将内存返还给操作系统。


这似乎符合您问题中的内存图。

另一件事需要注意的是堆大小(橙色)远未接近最大堆限制。如果接近该限制,GC 将停止增长堆。

最后,请注意,您显然可以通过为

-XX:ShenandoahUncommitDelay=<millis>

 选项使用较小的值来鼓励 Shenandoah 更快地归还未提交的内存。但是,建议不要将其设置得太小,因为这可能会减慢分配器的速度。

(来源:

https://www.javacodegeeks.com/2017/11/minimize-java-memory-usage-right-garbage-collector.html

© www.soinside.com 2019 - 2024. All rights reserved.