You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过存活探针命令在容器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

配置说明

  1. 检测命令逻辑

    • 用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会重启容器
  2. 时间参数建议

    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:22:07