经常会遇到线上服务内存飙高的问题,所以需要具体分析一下到底是哪块的代码出问题了。
1.jmap
使用命令:jmap -dump:format=b,file=/home/winds 23414
遇到了这样的问题:
23414: well-known file is not secure
这个问题是由于当前执行的用户与进程所属的用户不一致导致的。
通过以下命令解决即可
sudo -s //在自己的用户名下切换到root,不需要输入密码
sudo -u $user jstack $pid
然后再执行命令即可:
jmap -heap 23414 > test1.txt
还是可能会出现问题:
Attaching to process ID 23414, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 23414: Operation not permitted
发现进程所属的用户是www-data, 直接转换用户目录:
su www-data
然后再执行命令报错:
jmap -dump:format=b,file=/home/wushaofeng/20190625.dump 23414
Dumping heap to /home/wushaofeng/20190625.dump ...
Permission denied
很简单,把 /home/wushaofeng路径的权限修改为777
先回到自己的用户名路径下,然后执行命令
chmod 777 /home/wushaofeng
然后切换回www-data用户:
jmap -dump:format=b,file=/home/wushaofeng/20190625.dump 23414
下载到本地:
sz 文件名
进程pid转16进制:
printf "%x\n" 23414
接下来我需要用本地的jvisualvm对dump文件进行分析。
找到java_home 路径:
/usr/libexec/java_home
最后导入文件到visualvm中展示:
虚拟机配置参数说明:
-Xms1024m -Xmx3500m -Xmn512m -XX:PermSize=192m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=50
说明:
持续更新
https://blog.csdn.net/j080624/article/details/85679252