如何确定 JVM 选项的下限Xmx
或以其他方式在不经过反复试验的情况下节省内存?我碰巧设置Xms
了Xmx
相同的数量,我认为这有助于节省执行时间。如果我设置Xmx
为 7G,同样Xms
,它会很高兴地报告它正在被使用。我使用以下查询:
Runtime.getRuntime().totalMemory()
如果我将其设置为小于该值,例如 5GB,同样将全部使用。直到我提供的很少,比如说 1GB 才会出现堆外异常。由于我的执行时间通常为 10 小时或更长时间,因此我需要避免试错过程。
如何确定 JVM 选项的下限Xmx
或以其他方式在不经过反复试验的情况下节省内存?我碰巧设置Xms
了Xmx
相同的数量,我认为这有助于节省执行时间。如果我设置Xmx
为 7G,同样Xms
,它会很高兴地报告它正在被使用。我使用以下查询:
Runtime.getRuntime().totalMemory()
如果我将其设置为小于该值,例如 5GB,同样将全部使用。直到我提供的很少,比如说 1GB 才会出现堆外异常。由于我的执行时间通常为 10 小时或更长时间,因此我需要避免试错过程。
我会在使用 JConsole 监视堆使用情况时使用大量堆执行程序。记下主要垃圾收集后的最高内存使用量,并将最大堆大小设置为比该数量高 50% 到 100% 以避免频繁的垃圾收集。
顺便说一句,totalMemory 报告堆的大小,而不是当前使用了多少。如果您将最小和最大堆大小设置为相同的数字,无论您的程序做什么,totalMemory 都将是相同的......
使用Xms256M
andXmx512M
和一个简单的程序,freeMemory
分别是 244M 和totalMemory
245M 和maxMemory
455M。使用Xms512M
和Xmx512M
,数量为 488M、490M 和 490M。这表明totalMemory
是一个可变数量,如果Xms
小于,则可以变化Xmx
。这表明问题的答案是设置Xms
为少量并监控totalMemory
. 它还暗示maxMemory
了当前和未来对象的总数不能超过的最终堆大小。
一旦知道了高水位线,就将其设置Xmx
为比谨慎的要多一些——但不要过多,因为这是一种节约努力——并且设置Xms
为相同的数量以获得明显优选的时间效率。