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

时间:2019-05-13 09:10:36

标签: java garbage-collection heap-memory visualvm

我的Java应用程序的Heap size一直在增长,直到达到Max Heap size的{​​{1}}。为什么会这样?

我使用这些参数启动我的应用程序:

1G

Difference of Heap size and Used heap is grwoing

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

enter image description here

1 个答案:

答案 0 :(得分:2)

我对新的雪兰多厄GC的正常运行方式并不特别熟悉。但是,没有什么(对我来说)特别令人震惊。

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

  

“我们将在需要时夺走所有的记忆,但在不需要时也应将其归还”。

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

但是另一方面,如果您的系统处于空闲状态,GC将比许多其他GC更自由地将内存分配给操作系统。


这似乎适合您问题中的记忆图。

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

最后,请注意,您显然可以鼓励Shenandoah通过为-XX:ShenandoahUncommitDelay=<millis>选项使用较小的值来更快地返还未提交的内存。但是,建议不要将其设置得太小,因为这会减慢分配器的速度。

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