与 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 吗?
编辑:
一个答案已被删除,所以只是为了恢复我的评论:请注意我说的是最大尺寸,而不是当前尺寸。考虑到我在这里问这个问题之前已经研究了很多,所以没有必要教 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 每次都报告准确的值。