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 

在这里输入图像说明

  1. 为什么MinHeapFreeRatio和MaxHeapFreeRatio不能按预期工作?
  2. 如果上面的参数是好的,那么-Xmn的后果是什么,应该是什么值?
  3. 为了实现从JVM释放内存的任务,还有哪些其他解决scheme?

首先,这应该是一个评论 ,但它可能会很大。 问你自己,如果你真的想从JVM释放内存回操作系统。 收回它将是昂贵的,就像运行你的应用程序可能更昂贵 – 它会减慢你的速度。

那么,在java-8下你的默认收集器是Parallel GC ,我不是很确定那些MinHeapFreeRatioMaxHeapFreeRatio实际上是一起工作的。 我已经尝试了G1GC – 它确实,但没有与Parallel 。 然后添加-Xmn可能只是运气/好的时机; AFAIK它不应该影响其他两个参数。 这是一个相当有趣的答案,你有类似的问题。