我有一个Springboot应用程序,Mule作为微服务在docker容器内运行。即使闲置也需要大约700MB。注意到JVM已经分配了380 MB的堆,这是使用-Xmx
参数提供的最大堆。虽然分配了最大堆,但微服务在空闲时仅使用大约50 MB。问题是如何从JVM中释放未使用的内存。
似乎减少MaxHeapFreeRatio,当有更多可用内存比率时,我们可以要求JVM缩小。但是MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40
没有太大的区别,JVM没有释放内存。但是当我使用-Xmn
以上两个参数时,JVM会按预期释放堆内存。请参见下图,例如情景。
-Xmn100M -XX:+PrintGCDetails -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -Xmx384M
-Xmn
的后果是什么?它应该是什么价值?答案 0 :(得分:1)
首先,这应该真的是一个评论,但它可能会变大。如果真的非常希望将内存从JVM释放回操作系统,请自问。获取它将是昂贵的,就像运行你的应用程序可能更昂贵 - 它会减慢你的速度。
然后,java-8下的默认收集器是Parallel GC
,我不是非常确定那些MinHeapFreeRatio
和MaxHeapFreeRatio
实际使用它。我尝试使用G1GC
- 确实如此,但没有使用Parallel
。然后添加-Xmn
可能只是运气/好时机; AFAIK它不应该影响其他两个参数。对于您遇到的类似问题,this是一个相当有趣的答案。
答案 1 :(得分:0)
为了实现从JVM释放内存的任务,有哪些其他解决方案?
不确定您是否尝试过OpenJ9。它有一个调整机制来检测JVM何时空闲并将可用内存后页释放到OS。这篇article讨论了空闲调优功能。
您可以从adoptopenjdk获取OpenJDK-OpenJ9二进制文件。
如果您坚持使用OpenJDK-Hotspot组合,您可以尝试探索–XX:-ShrinkHeapInSteps
选项,这可能会积极地缩小堆,但我不确定它适用于哪些GC策略。