jdk堆、棧的分析工具--jmap、jstack

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裏找到對應的線程。
相關文章
相關標籤/搜索