最近在排查jvm相关的问题时候,使用到了jmap工具,在使用过程中遇到了以下问题:
1. 当使用jmap -heap pid查询内存状况的时候,提示cannot open binary file,如下图所示:
2. 当使用jmap -dump:format=b,file=/tmp/online.bin pid的时候,提示“35322: well-known file is not secure”,其中35322为进程id。执行jstack -l pid的时候,错误也是一样的。
在网上查询发现,解决方案主要分为以下三种:
- 执行命令的用户与启动进程的用户不同,可以通过ps命令或者/tmp/hsperfdata_user/pid文件来确认;
- 执行命令的jdk与启动进程的jdk不同;
- 反复重试;
经过排查确认:1)是同一个用户,没有其他用户操作;2)jdk环境也只有一个;3)重试n次无效;
最后经过折腾发现如下方案可行:
1)申请root用户权限;
2)在root用户下执行:
$JAVA_HOME/bin/jstack -F pid
$JAVA_HOME/bin/jmap -F -dump:format=b,file=/tmp/online.bin pid
不会再出现上述的错误,问题解决。一定要保证JAVA_HOME是启动jvm时用的java环境,否则可能会出现问题。