JVM堆内存监控核心是采集used/max/committed等指标,通过JMX或Actuator暴露,经Prometheus、Zabbix或APM平台配置采集、映射与告警,需注意单位统一、采样频率及max=-1时改用used/committed计算。

JVM 堆内存监控指标的配置,核心是采集 JVM 运行时暴露的内存使用数据(如 used、max、committed),再通过运维平台接入、展示和告警。不同平台操作略有差异,但逻辑一致:确认数据源 → 配置采集 → 映射指标 → 设置阈值与图表。
堆内存数据从哪里来
JVM 默认通过 JMX 或 /actuator/metrics(Spring Boot)等标准接口暴露堆内存信息。常见关键指标包括:
-
java.lang:type=Memory/HeapMemoryUsage.used(已用堆内存,字节) -
java.lang:type=Memory/HeapMemoryUsage.max(堆最大容量,字节) -
java.lang:type=Memory/HeapMemoryUsage.committed(已提交堆内存,字节)
注意:需确保 JVM 启动时开启 JMX(如
-Dcom.sun.management.jmxremote)或 Spring Boot Actuator 已启用management.endpoints.web.exposure.include=metrics,health,info。
在主流运维平台配置方式
Prometheus + Grafana(云原生常用)
-
采集端:部署
jmx_exporter,配置jmx.yml规则,抓取HeapMemoryUsage的used/max等属性; -
指标转换:
jvm_memory_used_bytes{area="heap"}和jvm_memory_max_bytes{area="heap"}是标准指标; -
计算使用率:在 Grafana 中用 PromQL 表达式:
100 * jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} - 建议加
rate()或avg_over_time()避免瞬时毛刺干扰。
Zabbix(传统企业常用)
- 使用
jmx.get监控项,填写:- Object:
java.lang:type=Memory - Attribute:
HeapMemoryUsage - Key:
jmx["java.lang:type=Memory","HeapMemoryUsage.used"](同理配max)
- Object:
- 创建计算型监控项(如
heap_usage_pct):100 * last("jmx[\"java.lang:type=Memory\",\"HeapMemoryUsage.used\"]") / last("jmx[\"java.lang:type=Memory\",\"HeapMemoryUsage.max\"]") - 关联触发器,例如:
{Template JVM:jmx["java.lang:type=Memory","HeapMemoryUsage.used"].last(0)} > 0.9 * {Template JVM:jmx["java.lang:type=Memory","HeapMemoryUsage.max"].last(0)}
自研或 APM 平台(如 SkyWalking、Pinpoint)
- 通常自动发现并上报 JVM 指标,无需手动配置采集;
- 在 UI 中进入「JVM 监控」页,勾选「堆内存使用率」「Old Gen 使用量」等维度;
- 告警策略中可直接选择
heap_usage_percent,设置持续 3 分钟 > 85% 触发。
关键注意事项
-
避免只看
used/max:当max为-1(表示未显式设置-Xmx),该比值无意义,应优先参考used/committed; -
区分新生代与老年代:
PS Eden Space、PS Old Gen等区域指标对 GC 分析更重要,建议一并采集; - 采样频率建议 15–30 秒:太频繁增加 JVM 压力,太慢可能错过短时 OOM;
-
注意单位统一:平台显示常需将字节转 MB/GB,Grafana 可设
bytes单位自动缩放,Zabbix 需在监控项中配置Units = B并勾选“Show as bytes”。
不复杂但容易忽略。


















