getcommittedvirtualmemorysize() 返回 jvm 进程已向操作系统承诺且保证可用的虚拟内存总量(字节),包含堆、元空间、线程栈、直接内存等所有已 commit 的地址空间,非堆内存也计入,不支持时返回-1。

getCommittedVirtualMemorySize() 返回的是 JVM 进程当前已向操作系统“承诺”(committed)且保证可用的虚拟内存总量(单位:字节),不是堆内存,也不是物理内存,而是进程地址空间中已被分配、可立即使用的那部分虚拟内存。
它和 JVM 堆内存的关系
这个值包含 JVM 已提交的所有内存区域:堆(heap)、元空间(Metaspace)、线程栈、直接内存(DirectByteBuffer)、JIT 代码缓存等。只要 JVM 向 OS 申请并成功 commit 了某块虚拟内存(例如通过 mmap 或 VirtualAlloc),它就算进这个总数。
- 它通常远大于
Runtime.maxMemory()(即 -Xmx,仅指最大堆) - 它可能小于
Runtime.totalMemory()+ 直接内存 + 元空间用量,如果某些区域尚未 commit(比如堆只 commit 了一部分) - 它不等于“已使用”的内存,而是“已保证能用”的内存 —— 即使还没写入数据,OS 也预留了页表项和交换空间(如需要)
它和操作系统虚拟内存的区别
这不是整个系统的虚拟内存,也不是 swap 总量,而是单个 Java 进程视角下已 commit 的虚拟地址空间大小:
- 在 Linux 上,近似对应
/proc/[pid]/statm的第 2 列(size)或/proc/[pid]/status中的VmSize - 在 Windows 上,接近
GetProcessMemoryInfo().CommitSize - 返回 -1 表示当前平台不支持该指标(极少见,多见于某些精简版容器或旧 JVM)
实际用途和注意事项
这个值适合用于监控进程内存承诺增长趋势,辅助判断是否存在原生内存泄漏(如大量 DirectByteBuffer 未释放、JNI 分配未回收):
- 如果
getCommittedVirtualMemorySize()持续上涨,但堆使用率(getHeapMemoryUsage().getUsed())平稳,需排查非堆内存 - 它不能直接反映物理内存压力;要看
getFreePhysicalMemorySize()或getFreeMemorySize() - 容器环境中(如 Docker),该值受 cgroup memory limit 约束,但本身不感知 limit —— 超限时会触发 OOM Killer,而非方法报错










