docker容器Jar包jmap jstack使用
进入Jar包容器内
docker exec -it xxx /bin/bash
或
docker exec -it xxx /bin/sh
获取线程ID
jps
1 jar
573 Jps
jstack 1
1: Unable to get pid of LinuxThreads manager thread
原因:Docker 自1.10版本开始加入的安全特性。类似于 jmap 这些 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而是Docker自1.10在默认的seccomp配置文件中禁用了ptrace
解决方案
如果使用docker-compose启动容器,如下加入 cap_add即可
test:
image: test.jar
ports:
- 8081:8081
cap_add:
- SYS_PTRACE
init: true
或
在启动命令行添加
docker run --init --cap-add=SYS_PTRACE ...
方案2、镜像安装tini,由它管理进程
Dockerfile中使用如下方式
RUN apk --update --no-cache add tini
#利用ENTRYPOINT一定会执行的特点,将它作为PID=1托管进程
ENTRYPOINT ["tini"]
CMD java $JAVA_OPTS -jar test.jar
方案3、用Shell脚本启动Java进程
编写脚本 docker-entrypoint.sh
# !/bin/bash
java $JAVA_OPTS -jar test.jar
Dockerfile中使用如下方式
CMD /docker-entrypoint.sh
jmap分析堆,定位内存溢出的具体类
jmap -histo:live 8
将定位详情输出到指定文件中查看
jmap -histo:live 8 > 8.txt (8.txt为要输出的文件内容)
导出堆信息
jmap -dump:format=b,file=heap.bin 8
使用jstack工具将进程信息打印输出到文件,查看文件可以根据线程号查找对应的信息
jstack 8 > 8jstack.txt
dump文件分析工具
IBM heapAnalyzer分析dump文件
https://www.ibm.com/support/pages/ibm-heapanalyzer
Eclipse Memory Analyzer
工具下载: http://www.eclipse.org/mat/downloads.php