JVM OOM时如何自动执行Shell脚本发送告警?保姆级配置教程

发布时间:2026/5/17 17:49:20

JVM OOM时如何自动执行Shell脚本发送告警?保姆级配置教程 JVM OOM时如何自动执行Shell脚本发送告警保姆级配置教程当Java应用在生产环境突发OOMOutOfMemoryError时快速响应远比事后分析更重要。本文将手把手教你配置JVM参数实现OOM发生时自动触发告警脚本同时兼顾HeapDump生成与权限管理等企业级需求。1. 核心JVM参数解析1.1 内存快照生成配置两个关键参数组合使用-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/path/to/dump.hprof注意路径需确保Java进程有写入权限。推荐使用绝对路径避免歧义例如-XX:HeapDumpPath/var/log/jvm_dumps/service_%p_%t.hprof其中%p自动替换为进程PID%t为时间戳。1.2 告警脚本触发机制-XX:OnOutOfMemoryError参数支持三种执行方式直接执行命令-XX:OnOutOfMemoryErrorecho OOM Alert /tmp/oom.log调用本地脚本-XX:OnOutOfMemoryError/opt/scripts/oom_alert.sh带参数执行-XX:OnOutOfMemoryError/opt/scripts/oom_alert.sh %p重要脚本执行顺序在HeapDump生成之后确保内存现场已保存2. 企业级告警脚本开发2.1 基础告警脚本示例创建/opt/scripts/oom_alert.sh#!/bin/bash # 获取基础信息 TIMESTAMP$(date %Y-%m-%d %T) HOSTNAME$(hostname) PID$1 # 通过%p传入的进程ID # 构造告警消息 MESSAGE[OOM Alert] ${TIMESTAMP} Host: ${HOSTNAME} PID: ${PID} Service: $(ps -p ${PID} -o comm) # 发送到企业微信机器人 curl -s -X POST \ -H Content-Type: application/json \ -d {msgtype:text,text:{content:${MESSAGE}}} \ https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyYOUR_KEY2.2 高级功能增强版#!/bin/bash # 添加磁盘空间检查 DUMP_DIR/var/log/jvm_dumps if [ $(df --outputpcent ${DUMP_DIR} | tail -1 | tr -d %) -gt 90 ]; then ALERT\nWARNING: Dump directory ${DUMP_DIR} is almost full fi # 邮件钉钉双通道告警 function send_alert() { # 邮件通知 echo -e $1 | mailx -s CRITICAL: OOM Alert adminexample.com # 钉钉机器人 curl -s -X POST \ -H Content-Type: application/json \ -d {msgtype:markdown,markdown:{title:OOM告警,text:$1}} \ https://oapi.dingtalk.com/robot/send?access_tokenYOUR_TOKEN }3. 生产环境配置要点3.1 权限控制矩阵配置项推荐权限说明HeapDump目录java用户:750防止其他用户误删dump文件告警脚本root:755避免被恶意修改日志目录java用户:770允许运维组访问设置权限示例chown java:appadmin /opt/scripts/oom_alert.sh chmod 750 /opt/scripts/oom_alert.sh3.2 容器化部署方案对于Kubernetes环境通过InitContainer准备脚本initContainers: - name: script-setup image: busybox command: [sh, -c, cp /tmp/scripts/oom_alert.sh /opt/scripts/] volumeMounts: - mountPath: /opt/scripts name: script-volume - mountPath: /tmp/scripts name: config-map-volume挂载持久化卷存储Dump文件volumes: - name: dump-volume persistentVolumeClaim: claimName: jvm-dump-pvc4. 全链路测试验证4.1 模拟OOM测试程序编写测试类OOMTester.javapublic class OOMTester { public static void main(String[] args) { Listbyte[] leakList new ArrayList(); while (true) { leakList.add(new byte[1024 * 1024]); // 持续分配1MB内存 System.out.println(Allocated: leakList.size() MB); } } }4.2 测试执行命令java -Xms64m -Xmx64m \ -XX:HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath/tmp/oom_test.hprof \ -XX:OnOutOfMemoryError/opt/scripts/oom_alert.sh %p \ OOMTester验证要点检查/tmp/oom_test.hprof是否生成查看系统日志确认脚本执行journalctl -u java-app | grep OOM Alert确认告警消息接收情况5. 性能优化与注意事项5.1 资源消耗控制Dump文件压缩添加-XX:HeapDumpBeforeFullGC减少文件大小脚本超时处理timeout 30s /opt/scripts/oom_alert.sh频率限制在脚本中添加锁文件检测避免频繁告警5.2 监控集成方案Prometheus监控示例rules: - alert: JVM_OOM_Detected expr: increase(jvm_oom_errors_total[1m]) 0 annotations: summary: OOM detected on {{ $labels.instance }} description: JVM process {{ $labels.pid }} crashed with OOM配套的脚本增强# 向Prometheus PushGateway上报指标 echo jvm_oom_errors_total 1 | curl --data-binary - http://pushgateway:9091/metrics/job/oom_monitor实际部署中发现将HeapDump生成与告警解耦通过监控系统触发后续处理能显著降低对故障JVM进程的影响。建议关键系统配置-XX:ExitOnOutOfMemoryError确保及时释放资源。

相关新闻