docker容器中进行Threaddump查看jvm状态

前言

在执行性能测试时需要导出Threaddump,程序运行在Docker容器中,在容器外不能直接使用jcmd 命令和jstack命令进行dump操作,会提示没有该命令,执行yum安装也不行。

解决办法:

查看正在运行的容器id
执行命令:docker ps

查到的docker容器id如下

使用docker exec进入Docker容器,命令如下:
docker exec -it 29198c060396 /bin/sh


运行jps,已经能看到刚才启动的spring boot应用了

这时就可以使用jstat,jmap等根据进程id查看程序状态了,以下是我运行jstack查看的堆栈信息


导出jmap dump的文件,进一步分析,copy docker中的文件到宿主机,命令如下
docker cp 29198c060396:/logs/d.20170726.txt .

d.20170726.txt 是我刚才用jmap -dump生成的文件

29198c060396是docker 容器id

在Docker中执行jstack时提示No such process,如下图:

原因分析:

docker中不能直接使用宿主机上的进程ID

解决方法:

docker container内进程信息,与宿主机上进程信息的映射关系,可以使用docker top查看宿主机与Docker中进程的对应关系,具体操作如下:

1. 找到容器的id

docker ps

2. 找到容器在宿主机上映射后的进程信息

docker top 9b40a74ceb82(容器id)

就会得到类似下面的信息,其中PID是容器内进程在宿主机上的pid,ppid是容器内进程在宿主机上的父进程pid

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                9849                1611                0                   Mar07               ?                   00:00:00            bash /usr/bin/start

找到对应的容器内PID后就可以使用JStack进行Thread dump操作


参考资料:

https://blog.csdn.net/longxing_123/article/details/76163980

https://blog.csdn.net/micklf/article/details/79563869

原文地址:https://www.cnblogs.com/wx170119/p/12445396.html