Java程序如何获取堆内存和栈内存大小?代码举例讲解

Java程序可以通过Runtime类的方法获取进程的堆内存和栈内存相关信息。

获取堆内存大小有两个方法:

  1. Runtime.totalMemory():返回JVM试图使用的、可被分配的总内存量(以字节为单位)。
  2. 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的内存模型,进行内存监控与故障排查。