jstack + jmap + MAT

jstack:

jstack是java虚拟机自带的一种堆栈跟踪工具:

jstack [-l] pid (pid 可以使用jps查看)

例:jstack 44076 &>$(date +%H%M)_44076.jstack.log

线程状态:

  • NEW,未启动的。不会出现在Dump中
  • RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁
  • BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)给block住了
  • WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(), join() 等语句里
  • TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)
  • TERMINATED,已退出的


以下表示线程在方法调用时,额外的重要的操作。线程Dump分析的重要信息。修饰上方的方法调用。

  • locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。
  • waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在迚入区等待。
  • waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁幵在等待区等待。
  • parking to wait for <地址> 目标


线程状态产生的原因:

  • runnable:状态一般为RUNNABLE
  • in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING
  • waiting for monitor entry:进入区等待,状态为BLOCKED
  • waiting on condition:等待区等待、被park
  • sleeping:休眠的线程,调用了Thread.sleep()

 jmap:

1.  jmap -heap pid     展示pid的整体堆信息

jmap -heap 44076 >> $(date +%H%M)_44076.jmap.heap.log


2.  jmap -histo pid     展示class的内存情况

jmap -histo 44076 >> $(date +%H%M)_44076.jmap.log

3.  jmap -histo:live pid>a.log
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。 可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。

jmap -histo:live   这个命令执行,JVM会先触发gc,然后再统计信息。

jmap histo:live pid &>/dev/null

jmap -histo:live 44076 >> $(date +%H%M)_44076.jmap.live.log


4.  dump 将内存使用的详细情况输出到文件

jmap -dump:live,format=b,file=a.log pid

jmap -dump:live,format=b,file=$(date +%H%M)_44076.jmap.dump.log 44076

说明:内存信息dump到a.log文件中,这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。

 

jmap使用举例:

  1. 使用jps查看线程ID
  2. 使用jstat -gc 3331 250 20 查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。
  3. 使用jstat -gccause pid:额外输出上次GC原因
  4. 使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件

 

内存泄露定位过程(Memory Analyzer Tool :MAT)

打dump:jmap -dump:format=b file=yarn.dump.log 1590   
之后用MemoryAnalyzer.exe分析(Memory Analyzer Tool)

https://blog.csdn.net/wanghuiqi2008/article/details/50724676

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章