【发布时间】:2011-10-29 01:00:09
【问题描述】:
与 JRockit 相比,我发现在 Sun 的 JVM 上获得的最大堆大小有一些奇怪的行为。
我在 64 位系统 (Ubuntu 11.04) 上的 64 位虚拟机上运行 IDEA。我正在测试的 JVM 版本是:Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)(我使用apt-get install sun-java6-jdk 和Oracle JRockit(R) (build R28.1.3-11-141760-1.6.0_24-20110301-1432-linux-x86_64, compiled mode)(几个月前我从 Oracle 网站下载的)。
如果我传递参数 -Xms1g -Xmx3g,IDEA 将在 Sun 的 JVM 上报告最大堆大小为 1820M,在 JRockit 上报告为 3072M(如预期)。
如果我通过 -Xms2g -Xmx4g,IDEA 将报告 Sun 的 3640M 和 JRockit 的 4096M。
发生了什么?那些神秘的数字 1820M 和 3640M = 2*1820M 是什么?难道不能以我想要的确切堆大小运行 Sun 的 JVM 吗?
编辑:
一个答案已被删除,所以只是为了让我的 cmets 回来:请注意我说的是 MAX 尺寸,而不是当前尺寸。考虑到我在这里问这个问题之前已经研究了很多,所以没有必要教 Xms、Xmx 或任何其他指定内存区域大小的参数的含义(这些可以在其他地方找到) .
编辑2:
我编写了以下简单代码来测试这种行为:
public static void main(String[] args) throws Exception {
while (true) {
final Runtime r = Runtime.getRuntime();
System.out.println("r.freeMemory() = " + r.freeMemory()/1024.0/1024);
System.out.println("r.totalMemory() = " + r.totalMemory()/1024.0/1024);
System.out.println("r.maxMemory() = " + r.maxMemory()/1024.0/1024);
Thread.sleep(1000);
}
}
然后我在 Sun 的 JVM 和 JRockit 上使用 -Xmx100m、-Xmx110m、-Xmx120m 等运行了许多不同的值。 Sun 将始终报告 maxMemory() 的奇怪值,并且在运行之间会以大步长(如 30M)增长。 JRockit 每次都会报告准确的值。
【问题讨论】:
-
顺便说一句,您使用的是什么版本的 JVM?只是想知道。
-
添加到问题中,因为这可能是我忘记提供的非常相关的信息!