如何减少JVM中的已分配堆内存

9
我们的JVM消耗的内存比预期的要多。我们进行了一些分析,发现没有泄漏。已使用的堆内存最大可达2.9 GB,但在闲置时间下降到800 MB。但是,已提交的堆增加到3.5 GB(有时为4 GB),并且从未下降。此外,在空闲时间之后,当使用的堆从800 MB增加时,已提交的堆内存也会增加到3.5 GB。因此,我们的服务器很快就会达到最大内存大小,我们不得不每隔一天重启它们。
我的问题如下:
  1. 我理解的是,已提交的堆内存是当前分配的内存。当使用的堆内存减少时,为什么已提交的内存不会减少?
  2. 当使用的堆内存从其级别(800 MB)增加时,已提交的堆内存也会从其级别(3.5GB)增加
我们的服务器上有以下内存设置:
-Xmx4096M -Xms1536M -XX:PermSize=128M -XX:MaxPermSize=512M

2
Committed 意味着被 JVM 分配;您的最大堆大小为 4GB,因此在需要时,已提交的内存会增加到该阈值。然后它可能会被归还给系统,但在您的情况下,JVM 可能不觉得有必要这样做。 - guido
3
https://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryUsage.html - guido
我建议你只给JVM可用的内存,例如3GB,这样你就不需要重新启动它了。 - Peter Lawrey
1个回答

3

您可以尝试调整 -XX:MaxHeapFreeRatio 参数,它是 "GC 后避免收缩的堆空闲比例的最大百分比"。默认值为 70。


我已经添加了这个,但是GC后堆大小并没有缩小。我为了测试目的设置了XX:MaxHeapFreeRatio为10,但实际的可用空间比这更多。我在一些论坛上读到JVM一旦占有内存就永远不会释放,这是真的吗,还是我需要添加其他参数来控制它? - Selvakumar Ponnusamy
1
现在加上-XX:+UseSerialGC后它可以工作了,如果我使用这个选项,还有其他问题需要面对吗? - Selvakumar Ponnusamy
好的,明白了。这会影响CPU利用率吗?如果不使用它,堆大小就不会缩小。我们有其他替代方法吗? - Selvakumar Ponnusamy
尝试使用UseG1GC,它既快速又可以收缩(似乎是这样)。 - Evgeniy Dorofeev
只有在我在jvisualvm中点击“执行GC”时才有效。但是当系统进行垃圾回收时,它不会减少堆大小,只会减少已使用的堆。我们不能每天手动执行“执行GC”。 - Selvakumar Ponnusamy
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接