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里找到对应的线程。
相关文章
相关标签/搜索