關於jmap的簡單使用和踩坑記錄



參數:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM