在运行时读取最大堆空间

众所周知, java -Xmx选项用于设置Java程序可用的最大堆空间。 但Java程序是否有办法读取已设置的值? 像System.getMaximumHeapSpace() (它不存在)之类的东西。

有一个Runtime.maxMemory ,文档中说这将返回Java虚拟机将尝试使用的最大内存量,但是它是否是启动JVM时设置的最大堆内存量并不具体。

就像测试一样,我编写了以下程序:

 class MaxMemory { public static void main(String[] args) { System.out.println(Runtime.getRuntime().maxMemory()); } } 

执行结果如下:

 C:\coobird\>java -Xmx64m MaxMemory 66650112 C:\coobird\>java -Xmx128m MaxMemory 133234688 

这是在Windows上使用Java SE 6版本1.6.0_12。

尽管这些值接近64 MB(67,108,864字节)和128 MB(134,217,728字节),但它们并非如此。

我得到的值远离Xmx值:

 java -Xmx64m MaxMemory 59703296 

64 * 1024 * 1024 = 67108864

 java -Xmx128m MaxMemory 119341056 

128 * 1024 * 1024 = 134217728

这是11%的差异! (你的只有0.7%;我赢了。)

 java -version java version "1.6.0_22" Java(TM) SE Runtime Environment (build 1.6.0_22-b04) Java HotSpot(TM) Server VM (build 17.1-b03, mixed mode) running on Linux 2.6 

我看到类似的结果。

-Xmx512m,我得到455M

-Xmx1024m,我得到910M

我使用ManagementFactory.getMemoryMXBean()获得相同的结果.getHeapMemoryUsage()

这些差异太大,不容忽视。