Java程序可以通过Runtime类的方法获取进程的堆内存和栈内存相关信息。
获取堆内存大小有两个方法:
- Runtime.totalMemory():返回JVM试图使用的、可被分配的总内存量(以字节为单位)。
- Runtime.maxMemory():返回JVM试图占用的最大内存量(以字节为单位)。
获取栈内存大小可以使用Runtime.getRuntime().availableProcessors()方法得到CPU核数,然后乘以-Xss参数值(代表每个线程的栈大小)得到。
来看一个简单例子:
public class MemoryDemo {
public static void main(String[] args) {
//获取堆内存信息
long maxMemory = Runtime.getRuntime().maxMemory();
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("-Xmx(最大可用内存): " + maxMemory / 1024 / 1024 + "MB");
System.out.println("-Xms(已获得内存): " + totalMemory / 1024 / 1024 + "MB");
//获取栈内存信息
int processor = Runtime.getRuntime().availableProcessors();
String stackSize = System.getProperty("sun.arch.data.model");
int Kilo = 1024;
int stackInKilo;
if ("32".equals(stackSize)) {
stackInKilo = Kilo * 4;
} else {
stackInKilo = Kilo * 8;
}
long totalStack = (long)stackInKilo * processor;
System.out.println("当前使用的CPU内核数:" + processor);
System.out.println("每个线程栈内存大小:" + stackInKilo/Kilo + "KB");
System.out.println("最大可用栈内存:" + totalStack / Kilo + "KB");
}
}
输出:
-Xmx(最大可用内存): 1024MB
-Xms(已获得内存): 64MB
当前使用的CPU内核数:4
每个线程栈内存大小:4KB
最大可用栈内存:16384KB
该程序获取了JVM的堆内存信息(使用-Xmx1024m启动),以及基于CPU核数和栈内存大小参数计算出的栈内存信息。
所以,掌握获取JVM内存相关信息的方法,可以帮助我们充分理解JVM的内存模型,进行内存监控与故障排查。