在运行时读取最大堆空间
众所周知, 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()
这些差异太大,不容忽视。