首先看下Tomcat的进程Id:
[root@iZ25Z ~]# ps aux | grep java
www 2111 4.0 23.5 1637648 452756 ? Sl 10:12 4:35 /usr/java/jdk1.7.0_80/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties ...
可以看到Tomcat的进程Id是2111, 然后用JDK自带工具jmap来导出整个JVM 中内存信息:
# jmap -dump:format=b,file=文件名 [pid]
jmap -dump:format=b,file=mm.hprof 2111
然而我们却得到了这个提示:
jmap -dump:format=b,file=mm.hprof 2111
2111: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
这是因为我是以root这个用户执行的这个语句,但我的tomcat进程是以www用户运行的(用 ps aux | grep java 便能看到)。我们可以在机器上找到 /tmp/hsperfdata_$USER/$PID一个这样的文件,当我们执行jmap出现上述信息时,先检查执行该命令的用户是否和hsperfdata_$USER这个文件所属的用户一致,如果不一致,切换成一致再执行即可,或者根据提示,直接加个 -F 参数即可:
jmap -F-dump:format=b,file=mm.hprof 2111
man page对这个选项的说明是:
-F Force. Use with jmap -dump or jmap -histo option if the pid does not respond. The live suboption is not supported in this mode.