docker容器Jar包jmap jstack使用

本文介绍了在Docker环境中遇到的JDK工具如jmap、jstack无法正常使用的问题,原因是Docker自1.10版本后的安全特性限制了ptrace。解决方案包括在docker-compose中添加`cap_add: SYS_PTRACE`,使用tini管理进程,或者通过编写启动脚本来启动Java应用。此外,还详细展示了如何使用jmap、jstack进行堆内存分析和导出堆信息,并推荐了IBM HeapAnalyzer和Eclipse Memory Analyzer等工具进行堆dump文件分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进入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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值