通过存活探针命令在容器JVM内存超85%时重启集群
针对JVM内存泄漏的Kubernetes存活探针配置方案
完整的存活探针配置
直接替换你manifest中的框架部分,完整配置如下:
livenessProbe: exec: command: - /bin/sh - -c - "jstat -gc $(pgrep java) | awk 'NR==3 {used=$3+$4+$6+$8; total=$2+$4+$7+$9; if (used/total*100 > 85) exit 1; exit 0}'" initialDelaySeconds: 60 periodSeconds: 30
配置说明
检测命令逻辑
- 用
pgrep java获取容器内Java进程的PID jstat -gc <PID>输出JVM堆内存的垃圾回收统计数据- 通过
awk计算已使用堆内存占总堆内存的比例:- 已使用内存 = Eden区使用量(S0U) + Survivor1区使用量(S1U) + 老年代使用量(OU) + 元空间使用量(MU)
- 总内存 = Eden区总量(S0C) + Survivor1区总量(S1C) + 老年代总量(OC) + 元空间总量(MC)
- 当使用率超过85%时,命令返回非0值(exit 1),触发存活探针失败,Kubernetes会重启容器
- 用
时间参数建议
initialDelaySeconds: 60:容器启动后60秒再开始检测,给JVM足够的初始化和预热时间periodSeconds: 30:每30秒执行一次检测,平衡检测频率和资源消耗
前提条件
- 容器镜像中必须包含
jstat(JDK自带,若用JRE镜像可能需要切换为JDK基础镜像)、awk、pgrep工具 - 如果容器内有多个Java进程,
pgrep java会返回多个PID,需要调整进程定位逻辑(比如通过ps aux | grep <你的应用启动类> | grep -v grep | awk '{print $2}'来精准获取目标PID)
注意事项
- 这只是短期缓解方案,长期必须排查并修复JVM内存泄漏问题
- 可根据你的应用实际内存使用情况,调整85%的阈值
- 若JVM配置了堆内存限制(比如
-Xmx),也可以结合cgroups内存统计来做检测(比如用cat /sys/fs/cgroup/memory/memory.usage_in_bytes对比限制值)
内容的提问来源于stack exchange,提问作者user313
相关产品推荐
相关产品推荐

