是否有一种可移植的方式让Java检查最大RAM量?

时间:2009-12-16 13:54:54

标签: java memory

我正在编写一个Java应用程序,需要检查系统中可用的最大RAM(而不是VM可用的RAM)。有可行的方法吗?

非常感谢: - )

4 个答案:

答案 0 :(得分:4)

JMX您可以访问java.lang的FreePhysicalMemorySize和TotalPhysicalMemorySize属性:type = OperatingSystem。 JavaDocs中没有真正记录这些属性,因此在所有JVM和平台上可能无法保证这些属性,但我们可以使用它们(使用Sun的JVM)。

在Java代码中,您可以通过以下方式访问MBean:ManagementFactory.getOperatingSystemMXBean()

这些属性是documented in the JavaDoc for Sun's implementation所以我认为如果你的应用程序在他们的JVM上运行,你可能会依赖它们。

答案 1 :(得分:2)

简短回答:没有,无法通过便携方式获得总RAM。

当然,有一种非常简单的方法可以获得总JVM内存(java.lang.Runtime.maxMemory()),但这不是你想要的。

要获得系统总RAM大小,您需要使用本机系统调用(完全不可移植)。

答案 2 :(得分:1)

您可以使用JNI调用来查询本机操作系统

但如果你想为JMV增加更多内存,你将不得不用新的内存参数重启JVM

答案 3 :(得分:-1)

“可用的最大RAM量” - 所以不是我假设安装的物理RAM?但操作系统可以访问的部分(1),(2)不用于存储操作系统代码,(3)不用于存储操作系统数据?

问题是,当操作系统将脏页刷新到磁盘时,此答案每毫秒都会更改,从而减少了上面的第(3)部分。如果确实需要RAM,操作系统通常会将部分内容交换掉,因此为(2)分配的RAM量也很模糊。

我们可能需要跳过虚拟化系统的情况,其中操作系统本身在VM中运行,因此您在VM中的操作系统中有一个JVM。