同事反馈java进程的内存越来越大,设置的是2G,但是占用了8G的内存。
docker里面的java进程在宿主机器无法进入,需要先进入docker容器,然后再安排。
1、进入docker容器:
docker exec -it docker_id /bin/bash
2、找到java进程
ps aux
看到Xms是2G
3、使用jmap查看jvm参数:
jmap -heap 8
发现内存占用比分配的大很多,jvm配合没有生效
4、通过下面命令查看当前进程的jvm运行参数:
jcmd
网上找了下,发现是xms和xmx写在jar包后面,导致没有生效,修改下就可以了
参考:【148】如何解决Linux上Java的-Xmx参数失效的问题_java -xmx 不生效-CSDN博客
附vm查询工具
1、通过jstat查看gc信息
jstat -gc 8 500
查看具体参数:【Linux篇】jstat命令详解_傻啦猫@_@的博客-CSDN博客
2、使用arthas进行分析(快速入门 | arthas)
1)从宿主机下载arthas:
curl -O https://arthas.aliyun.com/arthas-boot.jar
2)拷贝arthas.jar进入docker容器:
docker cp /home/dy/arthas-boot.jar 3d5a22f05760:/opt/
发现内存占用比分配的大很多
3、使用jmap把gc dump下来分析:
jmap -dump:live,format=b,file=./dump.hprof 8
docker cp 3d5a22f05760:/opt/dump.hprof /home/dy