如何减少 JVM 中的已提交堆内存
Posted
技术标签:
【中文标题】如何减少 JVM 中的已提交堆内存【英文标题】:How to reduce committed heap memory in JVM 【发布时间】:2015-04-23 14:27:49 【问题描述】:我们的 JVM 消耗的内存比预期的要多。我们做了一些分析,发现没有泄漏。使用的堆内存最大达到 2.9 GB,但在空闲时间下降到 800 MB。但是提交的堆增加到 3.5 GB(有时是 4 GB)并且永远不会下降。同样在空闲时间之后,当使用的堆从 800 MB 增加时,提交的堆内存从 3.5 GB 增加。所以我们的服务器很快就会达到最大内存大小,我们必须每隔一天重新启动它们。
我的问题是
-
我的理解是提交的堆内存是当前分配的内存。当使用的堆内存减少时,为什么提交的内存也没有减少?
当使用的堆内存从其级别(800 MB)增加时,提交的堆内存也从其级别(从 3.5GB)增加
我们的服务器中有以下内存设置:
-Xmx4096M -Xms1536M -XX:PermSize=128M -XX:MaxPermSize=512M
【问题讨论】:
Committed表示jvm分配的;您的最大堆大小为 4gigs,因此,在需要时,提交的内存会上升到该阈值。然后它可能返回给系统,但在你的情况下,jvm 可能不觉得有必要这样做。 docs.oracle.com/javase/7/docs/api/java/lang/management/… 我只会给 JVM 你可用的内存量,例如也许 3 GB,然后你不需要重新启动它。 【参考方案1】:您可以尝试调整 -XX:MaxHeapFreeRatio ,即“GC 后堆空闲的最大百分比以避免收缩”。默认值 = 70
【讨论】:
我已经添加了这个,但是 GC 后堆大小没有缩小。我将 XX:MaxHeapFreeRatio 设为 10 用于测试目的,但实际可用空间不止于此。我读过一些论坛,JVM一旦获得内存就永远不会释放内存。这是真的还是我需要添加任何其他参数来控制它。 当我添加 -XX:+UseSerialGC 时它现在可以工作,如果我提供此选项,我还需要面对其他问题吗? 好的,明白了。它也会影响 CPU 利用率吗?如果不使用它,堆大小不会缩小。我们还有其他替代方式吗 试试 UseG1GC 既快又能缩水(好像) 只有当我在 jvisualvm 中单击“Perform GC”时才有效。但是当系统执行 gc 时,它不会减少堆大小,它只会减少使用的堆。我们不能每天手动“执行 gc”以上是关于如何减少 JVM 中的已提交堆内存的主要内容,如果未能解决你的问题,请参考以下文章