java监控jvm内存使用率需区分堆内/堆外、整体/分区:runtime适合快速估算堆整体使用率;managementfactory可编程获取各内存池精确使用率;jstat适用于运维实时采样;jmap和arthas用于深度排查分区占比。

Java 中查看 JVM 各个内存区域使用率,核心是区分“堆内”与“堆外”、“整体”与“分区”,并选择适合场景的手段:代码监控适合嵌入逻辑或告警,命令行工具适合运维巡检,可视化工具适合深度分析。
用 Runtime 快速看堆内存整体使用率
适用于快速估算当前堆已用比例,不区分 Eden/Old/Metaspace,但轻量无侵入:
-
已用率 = (totalMemory() − freeMemory()) / maxMemory(),注意:
maxMemory()是 -Xmx 值,totalMemory()是已向 OS 申请的堆大小,freeMemory()是当前堆中未被对象占用的空闲字节(不是可分配空间) - 单位为字节,转 MB 需除以
1024L * 1024 - 示例代码:double usage = (double)(rt.totalMemory() - rt.freeMemory()) / rt.maxMemory();
用 ManagementFactory 查看堆/非堆及各内存池使用率
这是最结构化、可编程的方式,能精确到 Eden、Old、Metaspace、CodeCache 等具体区域:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()和.getNonHeapMemoryUsage(),分别获取堆与非堆的used、committed、max - 要查每个内存池(如 PS Eden Space、G1 Old Gen),遍历
ManagementFactory.getMemoryPoolMXBeans(),对每个MemoryPoolMXBean调用getUsage().getUsed()和getUsage().getMax()计算使用率 - 注意:部分池(如 Metaspace)
max可能为-1(无硬上限),此时建议用committed作分母更合理
用 jstat 实时观察各代使用率(运维常用)
无需修改代码、不重启服务,适合生产环境周期性采样:
-
jstat -gc <pid> 1s</pid>每秒输出一次,关键列含义:
EU(Eden Used)/EC(Eden Capacity)、OU(Old Used)/OC(Old Capacity)、MU(Metaspace Used)/MC(Metaspace Capacity)
使用率 = EU ÷ EC、OU ÷ OC、MU ÷ MC - 搭配
-gcutil更直观:jstat -gcutil <pid> 1s</pid>直接显示 E(Eden)、O(Old)、M(Metaspace)等列的百分比 - 若看到 O 列持续 >85% 或频繁 FGC,说明老年代压力大;M 列接近 100% 且持续增长,需警惕 Metaspace 泄漏
用 jmap 或 Arthas 查看详细分区占比(排查专用)
当需要确认配置是否生效、或对比不同 GC 算法下的分布差异时使用:
-
jmap -heap <pid></pid>输出 “Heap Usage” 区段,明确列出各代实际容量与已用量(如 G1 Heap 的 regions/capacity/use,或 Parallel GC 下的 PS Young/Old Gen) - Arthas 的
memory命令一键展示堆、非堆、Eden、Survivor、Old、Metaspace 的 used / max 及使用率百分比,支持高亮超阈值区域 - 注意:
jmap -heap在 G1 或 ZGC 下显示的是逻辑分区,而jstat -gc显示的是运行时实际内存块状态,二者应交叉验证
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










