參數:
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 排除哪些