java 提供 runtime 和 managementfactory 两种标准 api 获取 jvm 内存使用情况:runtime 适用于快速获取堆内存总量、空闲量和上限;managementfactory 支持分堆/非堆、内存池及系统物理内存的精细化监控。

Java 中可以通过标准 API 在代码层面直接获取当前 JVM 的内存使用情况,无需外部工具或依赖。核心方式有两种:基础 Runtime 类和更精细的 ManagementFactory + MXBean 接口,适用于不同粒度的需求。
用 Runtime 获取整体堆内存概况
这是最简单、最常用的方式,适合快速估算已用/最大堆内存:
- Runtime.getRuntime().totalMemory():JVM 当前已向操作系统申请的堆内存总量(字节)
- Runtime.getRuntime().freeMemory():当前堆中未被使用的空闲字节数(注意:不是“可分配”量,而是当前未被对象占用的部分)
- Runtime.getRuntime().maxMemory():JVM 堆内存上限(-Xmx 设置值),0 表示无限制(极少见)
已用堆内存 = totalMemory() − freeMemory()。该方法轻量、无侵入,但不区分堆内区域(Eden/Old/Metaspace),也不含非堆内存。
用 ManagementFactory 获取堆与非堆详细信息
借助 java.lang.management 包,可获得结构化、分区域的内存使用数据:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 调用 ManagementFactory.getMemoryMXBean() 获取全局内存管理接口
- getHeapMemoryUsage() 返回 MemoryUsage 对象,含 used、committed、max 三字段(单位:字节),对应堆内存实际使用、已提交、最大容量
- getNonHeapMemoryUsage() 同样返回 MemoryUsage,覆盖 Metaspace、CodeCache、压缩类空间等非堆区域
输出示例格式清晰:
[Heap] Used: 256 MB, Committed: 512 MB, Max: 1024 MB
[Non-Heap] Used: 85 MB, Committed: 128 MB, Max: 256 MB
按内存池(Memory Pool)逐项查看
若需观察 Eden、Survivor、Old、Metaspace 等具体区域的实时占用,可遍历所有内存池:
- 通过 ManagementFactory.getMemoryPoolMXBeans() 获取全部内存池列表
- 每个 MemoryPoolMXBean 提供 getName()、getType()(Heap / Non-heap)、getUsage().getUsed() 等方法
- 支持识别是否为“峰值使用量可重置”的池(如 Eden),也可监听 usageThreshold 警告
这种方式适合做精细化监控或触发阈值告警,例如当 Metaspace 使用超 90% 时自动记录日志。
补充:获取系统级内存(宿主机物理内存)
如果目标是了解 Java 进程所在机器的整体资源状况(比如判断是否因系统内存不足导致 OOM),可用:
- ManagementFactory.getOperatingSystemMXBean()
- 调用 getTotalPhysicalMemorySize() 和 getFreePhysicalMemorySize() 获取整机物理内存总量与空闲量
- 注意:该数据反映操作系统视角,与 JVM 堆参数无关,但对排查“系统级内存争抢”问题很关键
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










