有没有办法让Java通过所有JVM使用总RAM内存

问题描述 投票:1回答:3

是否有任何标准方法来获取java使用的总内存大小?

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

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

java memory jvm ram
3个回答
3
投票

不幸的是,标准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,即使尝试通过Reflection访问这些sun-packages也会被拒绝。

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


1
投票

可能有以下帮助?

Runtime runtime = Runtime.getRuntime();
int mb = 1024 * 1024;
log.info("Heap utilization statistics [MB]\nUsed Memory: {}\nFree Memory: {}\nTotal Memory: {}\nMax Memory: {}",
            (runtime.totalMemory() - runtime.freeMemory()) / mb, runtime.freeMemory() / mb,
            runtime.totalMemory() / mb, runtime.maxMemory() / mb);

0
投票

你总是可以用free -m执行一些合适的外部程序(比如ProcessBuilder)并解析它的输出。没有获取RAM总量的机制,因为Java可以使用它给定的堆。它不能分配内存,因此对于Java来说,堆是总内存。

© www.soinside.com 2019 - 2024. All rights reserved.