从java获取操作系统内存大小

Posted

技术标签:

【中文标题】从java获取操作系统内存大小【英文标题】:Getting OS memory size from java 【发布时间】:2011-05-19 03:12:03 【问题描述】:

有没有什么方法可以从java获取操作系统上总内存的大小?使用

Runtime.getRuntime().maxMemory()

返回 JVM 允许的内存,而不是操作系统。有没有人有办法获得这个(从java代码)?

【问题讨论】:

你需要知道什么 @Thorbjørn:如果我在具有 2GB RAM 但 JVM 限制为 1GB 的机器上运行,我想获得 2GB 大小而不是示例代码返回的 1GB 大小。还是你问我为什么需要它? 我问你需要它做什么 作为库的一部分,用于收集一些使用情况统计信息(当然,在用户同意的情况下) 【参考方案1】:

您可以通过此获取 RAM 使用情况。这与 windows 中的 taskmanager 显示的值相同

    com.sun.management.OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean)java.lang.management.ManagementFactory.getOperatingSystemMXBean();
    double percentage = ((double)bean.getFreeMemorySize() / (double)bean.getTotalPhysicalMemorySize()) * 100;
    percentage = 100 - percentage;
    System.out.println("RAM Usage: " + percentage + "%");

【讨论】:

【参考方案2】:

这对于纯 Java 是不可能的,您的程序在 Java 虚拟机上运行,​​因此它与操作系统隔离。我为此建议了 2 个解决方案:

1) 您可以使用 JNI 并调用 C++ 函数来执行此操作 2) 另一种选择是使用Runtime.exec()。然后你必须从"cat /proc/meminfo"获取信息

【讨论】:

【参考方案3】:
com.sun.management.OperatingSystemMXBean bean =
  (com.sun.management.OperatingSystemMXBean)
    java.lang.management.ManagementFactory.getOperatingSystemMXBean();
long max = bean.getTotalPhysicalMemorySize();

返回 JVM 的可用 RAM 大小(受 32 位限制),而不是堆大小。

【讨论】:

Java 8中的“访问限制:'OperatingSystemMXBean'类型不是API”,特指com.sun.management中的那个。【参考方案4】:

没有获取该信息的纯 Java 方法。您可以使用Runtime.exec() 启动特定于操作系统的命令,例如/usr/bin/free 在 Linux 上。仍然在 Linux 系统上,您可以使用 Java 文件访问类 (FileInputStream) 来解析 /proc/meminfo

【讨论】:

以上是关于从java获取操作系统内存大小的主要内容,如果未能解决你的问题,请参考以下文章

java如何获取一个对象的大小

如何获取可用系统内存的大小?

内存泄露分析

Android获取SD卡总容量,可用大小,机身内存总容量及可用大小的系统方法

实战JAVA虚拟机 JVM故障诊断与性能优化

从 Java 堆转储中获取已使用和释放的内存