显示java中总物理内存大小的错误答案

显示java中总物理内存大小的错误答案,java,Java,这是密码 import java.lang.management.ManagementFactory; public class MemorySize { public static void main(String[] args){ com.sun.management.OperatingSystemMXBean mxbean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOper

这是密码

import java.lang.management.ManagementFactory;

public class MemorySize {

   public static void main(String[] args){
    com.sun.management.OperatingSystemMXBean mxbean = 
    (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    System.out.println(mxbean.getTotalPhysicalMemorySize() + " Bytes "); 
上面的代码给出的输出值为
2147483647字节
,等于
1.99 GB

但是实际的
安装内存(RAM)是3.00 GB(2.30 GB可用)
。如何获得正确的值,即2.30 GB。请提供帮助。

32位进程允许占用的最大内存通常只有2GB。如果您使用64位JVM,您应该可以看到完整的大小。

您是否检查过缓冲区/缓存是否有内存空间?如果有的话。然后
(com.sun.management.OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
不提供缓冲区/缓存使用的空间。你可能需要试着阅读

/proc/meminfo文件以获取正确的内存信息


在Windows和Linux中,
getTotalPhysicalMemorySize
方法都是通过询问操作系统来实现的。在Linux的情况下,OpenJDK 11 JVM使用以下C代码执行此操作:

jlong num_avail_physical_pages = sysconf(_SC_AVPHYS_PAGES);
return (num_avail_physical_pages * page_size);
如果您查看手册页面中的
sysconf(3)
,它会这样说:

  • \u SC\u PHYS\u PAGES
    :物理内存的页数

  • \u SC\u AVPHYS\u PAGES
    :物理内存当前可用的页数

另一个消息来源告诉我:

\u SC\u AVPHYS\u PAGES
返回的值是应用程序在不妨碍任何其他进程的情况下可以使用的内存量(假定没有其他进程增加其内存使用)

如您所见,这不是全部物理RAM。相反,“可用”的是物理RAM

您可以将上述内容理解为(也可以)将该值限制为进程可能使用的RAM量。对于32位JVM,内存体系结构考虑将单个进程的地址空间限制在4GB以下。对于Windows,限制在2GB左右

(这是在Linux/OpenJDK 11上。我还没有检查其他平台和版本。)

无论哪种方式,该方法都返回它返回的内容。顺便说一句,这是使用纯Java所能得到的最好结果


“如何获得正确的值,即2.30 g”

您可能需要使用
System.exec(…)
来运行某些特定于平台的实用程序,并从其输出中提取信息。或者实现一个向操作系统询问不同问题的本机方法


但是,您可能不应该使用所谓的“正确”值来调整JVM的大小。如果您试图使用所有的物理RAM,那么很容易将操作系统推入危险的抖动行为。(你可能会唤醒可怕的oomkiller…然后它可能会选择错误的东西来杀死!)

这是在32位JVM上运行的吗?可能,我的意思是可能:JVM可能不允许使用其可用的全部
2.30GB
,因此返回允许使用的最大RAM。(仍然不确定…只是一个理论):-)这可能的副本在我的64位JVM上运行良好。我怀疑这是32位地址空间的限制(可能是向JVM进程报告的操作系统)。@Ganesh不是重复的。看起来这在2013年之前已经修复了src: