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