3

与 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 每次都报告准确的值。

4

1 回答 1

0

XmsXmx仅用于指示已分配堆的最小和最大大小 。分配的堆的实际大小可能/将是最小值和最大值之间的值,因为 JVM 可以调整堆的大小,尤其是在对象分配事件或垃圾收集事件期间。

如果您需要 JVM 使用“精确”堆大小,您可以指定彼此足够接近的值,以便不会发生堆大小调整XmsXmx当然,这些值必须对应于连续的可用内存量。

上面的部分假设了其他内容,出于实际目的可以忽略。

根据用于计算堆大小的代码,应注意返回的值与 Hotspot JVMRuntime.maxMemory() 的 Xmx 标志中传递的值不对应;文档含糊地说它只会返回一个值,该值指示JVM 可以使用的内存

从您发布的代码的行为推断,堆大小调整将导致针对不同的调用报告不同的值Runtime.maxMemory()。此外,无需指出 JRockit JVM 报告通过Xmx标志传入的值。

于 2011-08-17T15:28:03.400 回答