如何在没有试错过程的情况下确定JVM选项Xmx
的下限或以其他方式节省内存?我碰巧将Xms
和Xmx
设置为相同的金额,我认为这有助于节省执行时间。如果我将Xmx
设置为7G,同样Xms
,则会很高兴地报告所有内容都已被使用。我使用以下查询:
Runtime.getRuntime().totalMemory()
如果我将它设置为小于5GB,那么所有它都将被使用。直到我提供的东西要少得多,比如1GB会有一个堆外异常。由于我的执行时间通常为10小时或更长,因此我需要避免试错过程。
答案 0 :(得分:1)
我在使用JConsole监视堆使用情况时,使用大量堆来执行程序。记下主要垃圾收集后最高内存使用量,并将最大堆大小设置为比该数量高50%到100%,以避免频繁的垃圾收集。
另外,totalMemory报告堆的大小,而不是目前使用的堆的大小。如果将最小和最大堆大小设置为相同的数字,则无论程序执行什么操作,totalMemory都是相同的...
答案 1 :(得分:0)
使用Xms256M
和Xmx512M
以及一个简单的程序,freeMemory
为244M,totalMemory
为245M,maxMemory
为455M。使用Xms512M
和Xmx512M
,金额为488M,490M和490M。这表明totalMemory
是一个可变数量,如果Xms
小于Xmx
,则可能会有所不同。这表明问题的答案是将Xms
设置为少量,并监控totalMemory
的高水位线。它还建议maxMemory
是最终堆大小,不能超过当前和未来对象的总和。
一旦知道了高水位线,将Xmx
设置为比审慎的更多 - 但不要过多,因为这是一项节约工作 - 并将Xms
设置为相同等于获得明显优先的时间效率。