如何检测-Xmx param的实际值? Runtime.getRuntime()。maxMemory()不准确

时间:2013-09-05 06:37:46

标签: java memory jvm

在我的情况下,这个值通常与我指定的-Xmx不同。

对于-Xmx810M,它返回了821035008 783MB。根据各种(非真正可靠的)来源,它应该完全返回-Xmx参数指定的值。

我寻找:

  1. 找到-Xmx
  2. 的确切值的一种可靠方法
  3. 一些证明maxMemory()不准确的可靠来源

2 个答案:

答案 0 :(得分:6)

根据http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4391499(来自2001年,所以它可能在较新版本的JVM中有所改变):

“-Xmx标志的解释依赖于VM。有些VM, 包括HotSpot在内,强制执行此选项有效值的下限。“

正如之前的回答所述,MaxMemory是准确的,而Xmx标志只是一个建议。

上面的链接是通过SO上的earlier similar question的答案找到的。

如果你想找到用户指定的Xmx值,如果使用Sun(ahem,Oracle)JVM /,你可以简单地做大致如下操作:

String commandLineInput = System.getProperty("sun.java.command");
Pattern pattern = Pattern.compile("-Xmx(\\w*)");
Matcher matcher = pattern.matcher(commandLineInput);
while(matcher.find()) {
  System.out.println(matcher.group(1));
}

答案 1 :(得分:1)

Runtime.maxMemory()是准确的。它不是-Xmx选项。它的不准确程度取决于版本,我不确定它是什么提示而不是精确设置。

当totalMemory()与你的maxMemory()匹配时,你的内存不足。