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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统