【发布时间】:2017-09-18 11:56:08
【问题描述】:
我有一个 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
- 为什么 MinHeapFreeRatio 和 MaxHeapFreeRatio 不能按预期工作?
- 如果上面的参数没问题,
-Xmn的结果是什么,它的值应该是多少? - 还有哪些其他解决方案可以实现从 JVM 释放内存的任务?
【问题讨论】:
-
这是一个非常有效的问题,我也分享。这不仅仅是“几 MB”。许多 Java 应用程序都有这样一种模式,在它们的生命周期中的某个时间,他们需要大量内存来完成一项可能是几 GB 的大工作,然后他们再也不会使用该内存量,因为内存永远不会释放到操作系统这是一个很大的浪费。
标签: java spring-boot jvm