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

时间:2017-02-02 07:01:50

标签: java memory jvm ram

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

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

但是,com.sun.*包在所有JVM中都不可用。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

不幸的是,标准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上,没有平台独立的方式来获取它们,但至少,这段代码不会因链接错误而挽救,但允许在没有信息的情况下继续进行。

答案 2 :(得分:0)

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