项目中出现OOM,需要在线排查,发现线上的pod不支持jmap等命令,经过排查已解决该问题,现记录如下
1.首先在Dockerfile中要选用一个jdk,而非jre
那么将原
FROM openjdk:8-jre-alpine
改为:
FROM openjdk:8u191-jdk-alpine3.9
2.这样直接使用,由于java的pid 为1,所以使用jmap,jstack等工具时,会报错:
Unable to get pid of LinuxThreads manager thread
尝试了很多办法,最后靠使用tini解决的
首先制作一个含tini的镜像
FROM openjdk:8u191-jdk-alpine3.9
RUN apk add --no-cache tini
ENTRYPOINT ["tini”]
将该镜像推到自己的仓库,并命名,如:
openjdk:8u191-jdk-alpine3.9-with-tini
3.在自己的业务Dockerfile中使用该镜像,并修改启动命令,如下
FROM registry.cn-hangzhou.aliyuncs.com/xxxx/java:8u191-jdk-alpine3.9-tini
#其他命令
ADD *.war app.war
#注释旧的启动命令
#ENTRYPOINT ["./entrypoint.sh"]
ENTRYPOINT ["/sbin/tini", "--","./entrypoint.sh"]
EXPOSE 8082
4.启动可执行jmap等命令
jmap -dump:format=b,file=heapdump.phrof pid
得到hprof文件
5.从宿主机使用命令将文件从容器内部拷出来,当然你挂在目录也是可以的
kubectl cp podname:目录/文件 ./文件 -n namespace
6.使用命令将文件从宿主机下载到本地
sz ./heapdump.phrof
7.使用本机的jvisualvm 载入分析
完成