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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值