Java程序内存猛涨,找不到原因
先抱歉,这个问题能提供的线索很少。
目前线上跑着的一个Java服务,使用Java 8 u192,运行在k8s中。隔一段时间就会被K8s OOM Kill导致重启。今天运维告知内存突然猛涨,系统告警。看了下监控(只有k8s pod级别的监控,没有对JVM级别的监控),确实在一个时间点内存占用垂直上升了1个G左右,伴随cpu使用率涨了20%左右。
这个问题由来已久。之前能在容器内部dump,通过MAT等工具基本排除堆内存猛涨的可能性。线上环境,没法用NMT详细查看。
后来运维换了一次基础镜像,jmap等工具也用不了了。
今天用pmap看了下,基于rss排序,有一个anon的块占到了近3G,不知道是否和这个有关:
启动参数
java -Xmx2936m -Xms1000m -XX:CompressedClassSpaceSize=250m -XX:MetaspaceSize=250m -XX:MaxMetaspaceSize=1000m -XX:YoungGenerationSizeIncrement=30 -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:+UseCGroupMemoryLimitForHeap -Djava.security.egd=file:/dev/./urandom xxx.jar
在之前的工作中也遇到过类似情况,通过NMT和一些监控指标的收集,可以排除堆内存,直接内存占用高的问题,就是不清楚某一个占用特别高的块是做什么的。求问遇到这种情况有什么思路?有可能是什么问题?