我有一个Springboot应用程序,其中内置了一个名为Mule的微服务,作为docker容器运行。即使处于空闲状态,它也需要大约700MB的内存。注意到JVM已经分配了380 MB的堆内存,这是使用-Xmx
参数提供的最大堆,但是当微服务处于空闲状态时,它只使用了约50MB的内存。问题是如何释放JVM未使用的内存。
似乎通过减少MaxHeapFreeRatio,我们可以要求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 释放内存之外,还有哪些其他解决方案可以实现此任务?