Java内存告警需在堆使用率达85%~90%时触发,核心是准确采集真实堆使用率(used/max或committed)、分级阈值判断、多通道触达,并附带时间、IP、PID、JVM参数、使用率、GC次数及建议动作,且须闭环验证。

Java 内存使用率过高时,不能等 OOM 发生才响应,必须在 85%~90% 区间就触发告警。关键不是“能不能发”,而是“怎么发得准、发得快、有人管”。核心思路是:用标准指标采集 + 分级阈值判断 + 多通道触达。
盯住真实堆内存使用率,别被表象误导
很多告警失效,是因为监控对象错了。真正要算的是 JVM 堆内存实际使用占比:
- 取值来源:通过 ManagementFactory.getMemoryMXBean().getHeapMemoryUsage() 获取 used 和 max;或 Prometheus 中用 jvm_memory_used{area="heap"}/jvm_memory_max{area="heap"}
- 注意 max 可能为 -1(如未设 -Xmx),此时改用 committed 做分母更稳妥
- 避免误用 process_resident_memory_bytes(进程常驻内存),它含堆外内存、JIT 代码缓存等,波动大、干扰多
三种落地方式,按环境选最顺手的
不追求统一架构,优先保障告警不漏、不误、可维护:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Spring Boot 项目(推荐):启用 Actuator + Micrometer,暴露 /actuator/metrics/jvm.memory.used,再用 Prometheus 抓取。写一条简单告警规则:
alert: JavaHeapUsageHigh
expr: (jvm_memory_used{area="heap"} / jvm_memory_max{area="heap"}) > 0.85
for: 2m
labels: severity="warning" - Windows 服务器(如 Server 2008/2012):用 PerfMon 创建性能计数器告警,目标计数器选 Process/Java.exe/Working Set,但注意这只是进程物理内存,需结合 jstat 校验是否真由堆引起;告警触发后调用 PowerShell 脚本发邮件
- 无监控平台的老系统:写 Shell 或 BAT 脚本定时调用 jstat -gc <pid> 解析 YU、OU 字段,计算老年代使用率;超阈值直接调用 mail 或 curl 企业微信 webhook
告警内容必须带上下文,否则等于没发
一封有效告警邮件/消息,至少包含四项不可少的信息:
立即学习“Java免费学习笔记(深入)”;
- 发生时间(精确到秒)和所在服务器 IP 或主机名
- Java 进程 PID、启动参数(特别是 -Xms/-Xmx)、JDK 版本
- 当前堆使用率、老年代使用率、最近 1 分钟 minor GC 次数
- 建议动作:例如“请立即执行 jstack <pid> > jstack.log”或“检查缓存淘汰策略是否失效”
别只发一次,要闭环验证
告警发出只是开始,后续动作决定是否真解决问题:
- 设置告警抑制:同一实例 5 分钟内重复告警自动合并,防刷屏
- 关联日志:告警触发时,自动采集最近 2 分钟 GC 日志片段、线程快照
- 恢复通知:使用率回落至 70% 以下持续 3 分钟,发送恢复消息,形成闭环

















