我的Java应用程序的Heap size
一直在增长,直到达到Max Heap size
的{{1}}。为什么会这样?
我使用这些参数启动我的应用程序:
1G
编辑: 当我重新启动应用程序时,您会看到“堆大小”和“已用堆”之间没有缝隙,但是这个缝隙越来越大,我能以某种方式限制该缝隙吗?
答案 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)