0

如何确定 JVM 选项的下限Xmx或以其他方式在不经过反复试验的情况下节省内存?我碰巧设置XmsXmx相同的数量,我认为这有助于节省执行时间。如果我设置Xmx为 7G,同样Xms,它会很高兴地报告它正在被使用。我使用以下查询:

Runtime.getRuntime().totalMemory()

如果我将其设置为小于该值,例如 5GB,同样将全部使用。直到我提供的很少,比如说 1GB 才会出现堆外异常。由于我的执行时间通常为 10 小时或更长时间,因此我需要避免试错过程。

4

2 回答 2

1

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

顺便说一句,totalMemory 报告堆的大小,而不是当前使用了多少。如果您将最小和最大堆大小设置为相同的数字,无论您的程序做什么,totalMemory 都将是相同的......

于 2013-09-21T09:25:57.640 回答
0

使用Xms256MandXmx512M和一个简单的程序,freeMemory分别是 244M 和totalMemory245M 和maxMemory455M。使用Xms512MXmx512M,数量为 488M、490M 和 490M。这表明totalMemory是一个可变数量,如果Xms小于,则可以变化Xmx。这表明问题的答案是设置Xms为少量并监控totalMemory. 它还暗示maxMemory了当前和未来对象的总数不能超过的最终堆大小。

一旦知道了高水位线,就将其设置Xmx为比谨慎的要多一些——但不要过多,因为这是一种节约努力——并且设置Xms为相同的数量以获得明显优选的时间效率。

于 2013-09-21T11:59:14.960 回答