You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确定当前可用的JVM堆内存大小?

获取Java中实际可用内存的方法

首先明确:Java里的实际可用内存是当前未分配的堆内存(freeMemory()返回值)加上可被垃圾回收器回收的内存(即已分配但不再被引用的对象占用的空间)。要获取这个值,有两种实用方式:

  • 方式一:触发GC后读取freeMemory()
    虽然System.gc()不能强制JVM立即执行垃圾回收,但多数场景下会触发回收操作。执行后再调用Runtime.getRuntime().freeMemory(),得到的结果会更接近真实可用内存:

    System.gc();
    long actualFreeMemory = Runtime.getRuntime().freeMemory();
    

    注意:这种方式不适合在性能敏感的代码中频繁使用,GC会带来一定性能开销。

  • 方式二:通过MemoryMXBean获取精确内存数据
    借助JMX的MemoryMXBean可以拿到更详细的堆内存统计,包括总堆内存、已使用内存(含待回收垃圾)等,通过计算得到实际可用内存:

    import java.lang.management.ManagementFactory;
    import java.lang.management.MemoryMXBean;
    import java.lang.management.MemoryUsage;
    
    public class MemoryChecker {
        public static void main(String[] args) {
            MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
            MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
            
            long maxHeap = heapUsage.getMax(); // JVM可使用的最大堆内存(对应-Xmx参数)
            long usedHeap = heapUsage.getUsed(); // 当前已分配的堆内存(含存活对象和待回收垃圾)
            long actualAvailable = maxHeap - usedHeap; // 实际可用堆内存
            
            System.out.println("实际可用堆内存: " + actualAvailable + " bytes");
        }
    }
    

    这里的差值就是程序理论上能使用的最大可用内存(只要JVM未达到堆内存上限)。

额外说明:

  • 无论哪种方式得到的都是近似值,因为JVM内存管理是动态的,获取数值的同时可能已有新对象分配或垃圾被回收。
  • 如果JVM还没达到最大堆内存,当程序需要更多空间时,JVM可能自动扩展堆空间(直到-Xmx限制),这部分可扩展空间也属于实际可用内存。

内容的提问来源于stack exchange,提问作者William

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:14:53