如何使用Xmx JVM选项节省内存使用

时间:2013-09-21 09:18:55

标签: memory jvm jvm-arguments

如何在没有试错过程的情况下确定JVM选项Xmx的下限或以其他方式节省内存?我碰巧将XmsXmx设置为相同的金额,我认为这有助于节省执行时间。如果我将Xmx设置为7G,同样Xms,则会很高兴地报告所有内容都已被使用。我使用以下查询:

Runtime.getRuntime().totalMemory()

如果我将它设置为小于5GB,那么所有它都将被使用。直到我提供的东西要少得多,比如1GB会有一个堆外异常。由于我的执行时间通常为10小时或更长,因此我需要避免试错过程。

2 个答案:

答案 0 :(得分:1)

我在使用JConsole监视堆使用情况时,使用大量堆来执行程序。记下主要垃圾收集后最高内存使用量,并将最大堆大小设置为比该数量高50%到100%,以避免频繁的垃圾收集。

另外,totalMemory报告堆的大小,而不是目前使用的堆的大小。如果将最小和最大堆大小设置为相同的数字,则无论程序执行什么操作,totalMemory都是相同的...

答案 1 :(得分:0)

使用Xms256MXmx512M以及一个简单的程序,freeMemory为244M,totalMemory为245M,maxMemory为455M。使用Xms512MXmx512M,金额为488M,490M和490M。这表明totalMemory是一个可变数量,如果Xms小于Xmx,则可能会有所不同。这表明问题的答案是将Xms设置为少量,并监控totalMemory的高水位线。它还建议maxMemory是最终堆大小,不能超过当前和未来对象的总和。

一旦知道了高水位线,将Xmx设置为比审慎的更多 - 但不要过多,因为这是一项节约工作 - 并将Xms设置为相同等于获得明显优先的时间效率。