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里找到对应的线程。