java - 有没有办法获得 Java 通过所有 JVM 使用的总 RAM 内存

标签 java memory jvm ram

有没有标准方法可以获取java使用的总内存大小?

我在 stackoverflow 中找到了这个答案:
https://stackoverflow.com/a/4335461/5060185

但是,com.sun.* 软件包并非在所有 JVM 中都可用。

最佳答案

不幸的是,标准 API 中没有这样的功能。但是您可以以故障安全的方式使用扩展 API,而无需显式引用非标准包:

public class PhysicalMemory {
    public static void main(String[] args) {
        String[] attr={ "TotalPhysicalMemorySize", "FreePhysicalMemorySize"};
        OperatingSystemMXBean op = ManagementFactory.getOperatingSystemMXBean();
        List<Attribute> al;
        try {
            al = ManagementFactory.getPlatformMBeanServer()
                                  .getAttributes(op.getObjectName(), attr).asList();
        } catch (InstanceNotFoundException | ReflectionException ex) {
            Logger.getLogger(PhysicalMemory.class.getName()).log(Level.SEVERE, null, ex);
            al = Collections.emptyList();
        }
        for(Attribute a: al) {
            System.out.println(a.getName()+": "+a.getValue());
        }
    }
}

这将打印 TotalPhysicalMemorySizeFreePhysicalMemorySize 属性的值(如果可用),无论它们是如何实现的或在哪个包中实现。这在 Java 9 中仍然有效,甚至尝试通过反射访问这些 sun-packages 都会被拒绝。

在没有这些属性的 JRE 上,没有独立于平台的方法来获取它们,但至少,此代码不会因链接错误而退出,但允许在没有信息的情况下继续。

关于java - 有没有办法获得 Java 通过所有 JVM 使用的总 RAM 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41996019/

相关文章:

memory - CUDA 表面与纹理

java - 如何在 FTL 中迭代 TreeMap 列表

java - Java如何保留/使用内存?

java - "declare a static final serialVersionUID"警告是什么意思以及如何解决?

java - 我怎样才能得到只有年份列表对话框

java - 使用 Java 将 .csv 文件解析为 xml

c++ - Qt - 如何处理对话框的内存管理?

linux - Teradata SLES Linux 服务器上的内存使用情况

Hadoop DataNode 内存消耗和 GC 行为

java - 使用Javadocs生成Swagger文档