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使用舉例:
- 使用jps查看線程ID
- 使用jstat -gc 3331 250 20 查看gc情況,一般比較關注PERM區的情況,查看GC的增長情況。
- 使用jstat -gccause pid:額外輸出上次GC原因
- 使用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