是否有任何标准方法可以获得java使用的总内存大小?
我在stackoverflow中找到了这个答案:
https://stackoverflow.com/a/4335461/5060185
但是,com.sun.*
包在所有JVM中都不可用。
答案 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());
}
}
}
这将打印TotalPhysicalMemorySize
,FreePhysicalMemorySize
属性的值(如果可用),无论它们的实现方式或方式如何。这仍然适用于Java 9,即使尝试通过Reflection访问这些sun-packages也会被拒绝。
在没有这些属性的JRE上,没有平台独立的方式来获取它们,但至少,这段代码不会因链接错误而挽救,但允许在没有信息的情况下继续进行。
答案 2 :(得分:0)
您总是可以使用free -m
执行一些合适的外部程序(如ProcessBuilder
)并解析其输出。没有获得RAM总量的机制,因为Java使用它给定的堆。它不能分配内存,因此对于Java来说,堆 是总内存。