JVM发布未使用的堆

时间:2017-04-21 13:00:57

标签: java spring-boot jvm

我有一个Springboot应用程序,Mule作为微服务在docker容器内运行。即使闲置也需要大约700MB。注意到JVM已经分配了380 MB的堆,这是使用-Xmx参数提供的最大堆。虽然分配了最大堆,但微服务在空闲时仅使用大约50 MB。问题是如何从JVM中释放未使用的内存。

似乎减少MaxHeapFreeRatio,当有更多可用内存比率时,我们可以要求JVM缩小。但是MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40没有太大的区别,JVM没有释放内存。但是当我使用-Xmn以上两个参数时,JVM会按预期释放堆内存。请参见下图,例如情景。

Java版本8

-Xmn100M  -XX:+PrintGCDetails  -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -Xmx384M

enter image description here

  1. 为什么MinHeapFreeRatio和MaxHeapFreeRatio无法按预期工作?
  2. 如果上述参数合适,-Xmn的后果是什么?它应该是什么价值?
  3. 为了完成从JVM释放内存的任务,有哪些其他解决方案?

2 个答案:

答案 0 :(得分:1)

首先,这应该真的是一个评论,但它可能会变大。如果真的非常希望将内存从JVM释放回操作系统,请自问。获取它将是昂贵的,就像运行你的应用程序可能更昂贵 - 它会减慢你的速度。

然后,java-8下的默认收集器是Parallel GC,我不是非常确定那些MinHeapFreeRatioMaxHeapFreeRatio实际使用它。我尝试使用G1GC - 确实如此,但没有使用Parallel。然后添加-Xmn可能只是运气/好时机; AFAIK它不应该影响其他两个参数。对于您遇到的类似问题,this是一个相当有趣的答案。

答案 1 :(得分:0)

  

为了实现从JVM释放内存的任务,有哪些其他解决方案?

不确定您是否尝试过OpenJ9。它有一个调整机制来检测JVM何时空闲并将可用内存后页释放到OS。这篇article讨论了空闲调优功能。

您可以从adoptopenjdk获取OpenJDK-OpenJ9二进制文件。

如果您坚持使用OpenJDK-Hotspot组合,您可以尝试探索–XX:-ShrinkHeapInSteps选项,这可能会积极地缩小堆,但我不确定它适用于哪些GC策略。