k8s的pod机器cpu和内存打满问题排查
一、问题
线上多个机器cpu及内存居高不下,内存占用超过2.5GB,马上接近3GB,系统报错 outof Memory
二、调查过程
(1) 查看是否有请求激增,es日志查看
(2) jstack打印thread现场,最好间隔执行两次,通过对比两次判断是否有死锁
ps aux|grep java
jstack PID > /tmp/final_thread_stack.log
(3) jmap打印heap,查看内存占用情况
jmap -dump:live,format=b,file=/tmp/heap_dump.hprof PID
(4) 查看gc情况
每秒打印一次GC统计信息
jstat -gcutil PID 1000
关键指标:
- O(O区):是否接近100%?
- FGC (Full GC次数):是否在疯狂增加?
- FGCT (Full GC总耗时):是否一直在涨?
如果 FGC 频繁增加但 O区几乎不下降,确认为内存泄漏。
三、结论
(1) 2026.04.17周五,新上权限检查需求会高频调用HomeCacheHelper_v2导致问题加速暴露
(2) Java堆内存设置偏小2G
(3) 使用jprofiler打开.hprof文件,查看最大对象,发现HomeCacheHelper_v2类缓存未设置过期及上限值,同时把ApplicationModel也缓存起来了,里面的appPromp最大,10128字节,每个对象持有一份
四、修复方案
(1) 调整java堆上限,建议可调整到4g,pod上限目前是8g
-Xms4g -Xmx4g
(2) 修改HomeCacheHelper_v2,设置上限,去掉ApplicationModel缓存,仅缓存必要内容,例如appCode
五、后续优化
(1) 将离线跑批和在线服务进行拆分,单独部署离线服务,避免离线任务对在线服务影响。(非此次问题)
(2) 加强稳定性建设,加强服务可观测能力和报警检测能力,建立服务接口调用的 qps,latency,errorCode,内存,cpu 等可视化能力。

浙公网安备 33010602011771号