jmap(Java Memory Map):java內存映像工具java
說明:生成堆快照(堆快照被稱爲heap dump)、查詢java堆、永久代的詳細信息、查詢finalize執行隊列(F-Queue)。 格式:jmap [option] PID Options: -dump[:子參數] 生成java堆的快照。eg:jmap -dump:live,format=b,file=heapDump.bin PID live dump only live objects; if not specified, all objects in the heap are dumped. format=b binary format file=fileName -heap 顯示java堆的詳細信息。 -histo[:子參數] 統計java堆中的對象信息,子參數只有一個live(做用同-dump的字參數live)。 -finalizerinfo 顯示在F-Queue中等待 Finalizer線程 執行finalize方法的對象。 -permstat 顯示永久代的狀態。 -F Use with -dump or -histo to force a heap dump or histogram when pid does not respond. The "live" suboption is not supported in this mode. 應用: 1)查看java堆的詳細信息。 舉例: jmap -histo 91376 > ./temp/temp.txt # 統計堆中各種型對象的數量。 jmap -histo:live 91376 > ./temp/temp2.txt # 統計堆中各種型存活對象的數量。 結果: num #instances #bytes class name 1: 22049102 859951024 [C 2: 21758045 522193080 java.lang.String 3: 1576903 499085680 [B 4: 2485149 278336688 com.xxx.dto.MCRecordDetail 5: 7592189 182212536 java.lang.Long 6: 2498302 59959248 java.util.Date 7: 208692 45941384 [I 8: 311973 32390848 [Ljava.lang.Object; 9: 668 21899712 [Ljava.util.concurrent.ForkJoinTask; 10: 613551 19633632 java.util.HashMap$Node 11: 1130265 18084240 java.lang.Integer 12: 104663 11772944 [Ljava.util.HashMap$Node; 13: 171028 8209344 java.util.HashMap 14: 125504 6120224 [Ljava.lang.String; 15: 90864 5743424 [[B 16: 223564 5365536 java.util.ArrayList 說明: 不一樣類型數組的class name: [C 表示 char[] [S 表示 short[] [I 表示 int[] [B 表示 byte[] [[I 表示 int[][] 分析: 結果是排好序的,數量最多的類型排在最上面。 [C對象佔用Heap這麼多,每每跟String有關,String內部使用final char[]數組來存儲數據。
jhat(java Heap Analysis Tool):java堆(快照)分析工具數組
說明: 1)jhat一般與jmap一塊兒使用,使用jhat來分析jmap生成的堆快照。 2)jhat內置了一個微型的HTTP/HTML服務器,使用jhat對heap dump進行分析後,能夠在瀏覽器中查看分析的結果,查看地址:http://localhost:7000/ 3)咱們通常會使用一些更加高級的工具(eg:VisualVM、Eclipse Memory Analyzer)來分析heap dump,而不是使用jhat來分析heap dump。 格式:jhat /data/test/heapDump.bin
jstack(Java Stack Trace):java堆棧跟蹤工具瀏覽器
說明:生成虛擬機當前時刻的線程快照(線程快照被稱爲thread dump或javacore文件) 格式:jstack [option] PID Options: -F to force a thread dump. Use when jstack <pid> does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message 應用:排查線程出現長時間停頓的緣由 1)線程出現長時間停頓的常見場景: 1>死循環 2>線程間發生了死鎖 3>請求外部資源致使的長時間等待 2)經常使用命令: 1>轉儲堆棧信息:jstack PID > /data/test/threadDumpFile 2>統計全部的線程分別處於什麼狀態:jstack PID | grep java.lang.Thread.State | awk '{print $2$3$4$5}' | sort | uniq -c 注意: 1)dump出來的線程ID(nid的值就是線程ID)是十六進制的,而咱們用TOP命令看到的線程ID是十進制的。 注:使用printf命令將十進制的ID轉換爲十六進制的ID:printf "%x\n" 十進制的ID 2)用十六進制的ID去dump裏找到對應的線程。