参数:
option: 选项参数。
pid: 需要打印配置信息的进程ID。
executable: 产生核心dump的Java可执行文件。
core: 需要打印配置信息的核心文件。
server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
remote server IP or hostname 远程调试服务器的IP地址或主机名。
option
no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
heap: 显示Java堆详细信息
histo[:live]: 显示堆中对象的统计信息
clstats:打印类加载器信息
finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump::生成堆转储快照
F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
help:打印帮助信息
J:指定传递给运行jmap的JVM的参数
链接:https://www.jianshu.com/p/a4ad53179df3,包括更加详细的实例操作。
报错记录
jmap -histo 是没有什么问题的,但是jmap总是出现问题
Attaching to process ID 614, please wait...
attach: task_for_pid(614) failed (5)
Error attaching to process: Error attaching to process, or no such process
前面加上sudo
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the
process. Could be caused by an incorrect pid or lack of privileges.
mac上好像无解了,linux上https://blog.csdn.net/wxa136/article/details/22647733
Caused by: java.lang.RuntimeException: Type "Klass*", referenced in
VMStructs::localHotSpotVMStructs in the remote VM, was not present in the remote
VMStructs::localHotSpotVMTypes table (should have been caught in the debug build
of that VM). Can not continue.
修改jdk为1.8
通过java api进行监控哪些类消耗jvm内存
Windows系统:
String[] cmds = new String[]{
"cmd",
"/c",
"jmap -histo:live [pid] | findstr \"com.sun org.sun\" | findstr -v \"com.cloudwise.agent com.java\""
};
Process p = Runtime.getRuntime().exec(cmds);
Linux系统:
String[] cmds = new String[]{
"/bin/sh",
"-c",
"jmap -histo:live [pid] | grep \"com.sun\\|org.sun\" | grep -v \"com.cloudwise.agent\\|com.java\""
};
Process p = Runtime.getRuntime().exec(cmds);
上面的意思是grep 包括哪些 grep -v 排除哪些