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

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