排查部署在docker内的Java程序内存占用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

问题

  • 我们的spring boot程序都是打成镜像部署在docker里的
  • 某个微服务功能比较单一用户量也不多但在启动过程中发现内存占用2G
  • 现在需要排查下内存占用情况

处理

  • 排查docker里的Java程序的内存占用其实和在Linux里直接部署启动的Java程序都是一样的
  • 这里使用Java自带的一些命令来排查先进入docker里面docker exec -it xxx /bin/bash
  • 使用jstack查看一下线程使用情况结果发现bash: jstack: command not found去java文件夹下面确实找不到命令
  • 这里就需要注意了你的Java程序镜像使用的事 jdk 还是 jre因为这些命令是jdk里有的使用jre构建是用不了的。这里为了调试可以将镜像先改成 jdk 调试完再改回去
  • 继续调试使用jmap查看下堆栈发现如下报错。这里要注意你进入docker的用户是不是启动用户用户不一致无法执行
 jmap -dump:format=b,file=core.dump 1
Picked up _JAVA_OPTIONS: -Xmx1G -Xms1G
Exception in thread "main" com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file /proc/1/root/tmp/.java_pid1: target process 1 doesn't respond within 10500ms or HotSpot VM not loaded
	at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:100)
	at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)
	at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
	at jdk.jcmd/sun.tools.jmap.JMap.executeCommandForPid(JMap.java:128)
	at jdk.jcmd/sun.tools.jmap.JMap.dump(JMap.java:208)
	at jdk.jcmd/sun.tools.jmap.JMap.main(JMap.java:114)
  • 想生成dump文件结果发现没有写文件权限
I have no name!@d834ffe5656e:/$ jmap -dump:format=b,file=core.dump 1
Picked up _JAVA_OPTIONS: -Xmx1G -Xms1G
Dumping heap to /core.dump ...
Unable to create /core.dump: Permission denied
  • 使用root账户进入dockerdocker exec -u 0 -it xxx /bin/bash分别对java安装目录用java -version查看版本java的bin目录以及java的bin目录下jmap命令文件设置权限,在对应目录下输入下面三个命令
chmod 777 jdk
chmod 777 bin
chmod 777 jmap
  • 没问题了可以正常使用命令和输出文件了
  • 生成文件后退出docker使用命令获取dump文件到宿主机docker cp 容器id:/位置 位置
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: JavaDocker