JVM释放未使用的堆
我有一个运行在Docker容器内的Mule的Springboot应用程序作为一个微服务。 即使闲置也需要700MB。 注意到JVM已经分配了380 MB的堆,这是使用-Xmx
参数提供的最大堆。 尽pipe分配了最大堆,但微服务闲置时仅占用大约50 MB的空间。 问题是如何从JVM中释放未使用的内存。
看来,减lessMaxHeapFreeRatio我们可以要求JVM缩小,当有更多的空闲内存比。 然而MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40
没有太大的区别,JVM也没有释放内存。 但是,当我使用具有上述两个参数的-Xmn
时,JVM按预期释放堆内存。 示例场景见下图。
Java版本8
-Xmn100M -XX:+PrintGCDetails -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -Xmx384M
- 为什么MinHeapFreeRatio和MaxHeapFreeRatio不能按预期工作?
- 如果上面的参数是好的,那么
-Xmn
的后果是什么,应该是什么值? - 为了实现从JVM释放内存的任务,还有哪些其他解决scheme?
首先,这应该是一个评论 ,但它可能会很大。 问你自己,如果你真的想从JVM释放内存回操作系统。 收回它将是昂贵的,就像运行你的应用程序可能更昂贵 – 它会减慢你的速度。
那么,在java-8下你的默认收集器是Parallel GC
,我不是很确定那些MinHeapFreeRatio
和MaxHeapFreeRatio
实际上是一起工作的。 我已经尝试了G1GC
– 它确实,但没有与Parallel
。 然后添加-Xmn
可能只是运气/好的时机; AFAIK它不应该影响其他两个参数。 这是一个相当有趣的答案,你有类似的问题。