您的位置:首页 > 编程语言 > Java开发

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

2018-01-09 00:00 169 查看
jmap(Java Memory Map):java内存映像工具

说明:生成堆快照(堆快照被称为heap dump)、查询java堆、永久代的详细信息、查询finalize执行队列(F-Queue)。

格式:jmap [option] PID

Options:
-dump[:子参数] 		生成java堆的快照。eg:jmap -dump:live,format=b,file=heapDump.bin
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堆的详细信息。
2)如果有大量的对象被长期引用,则很可能产生了内存泄露,那么就需要就要结合代码,找到引起内存泄露的代码并进行优化。

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里找到对应的线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jmap jstack
相关文章推荐