一、Jmap
jmap [option] pid
(一) 參數
-dump:[live,]format=b,file=
使用hprof二進制形式,輸出jvm的heap內容到file參數指定的文件。 live子選項是可選的,假如指定live選項,那么只輸出活的對象到文件.-finalizerinfo
打印正等候回收的對象的信息.-heap
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.-histo[:live]
打印每個class的實例數目,內存占用,類全名信息。VM的內部類名字開頭會加上前綴”*”. 如果live子參數加上后,只統計活的對象數量.-clstats
打印classloader的信息。包含每個classloader的名字,活潑性,地址,父classloader和加載的class數量. 另外,內部String的數量和占用內存數也會打印出來.
(二) 實例
1、 查看對象實例統計數據
jmap -histo pid 或者 jmap -histo:live pid
2、 查看系統ClassLoader信息
jmap -clstats pid
3、 獲取當前堆快照
jmap -dump:format=b,file=heap.hprof pid
(三) 注意
jmap -dump
這個命令執行,JVM會將整個heap的信息dump寫入到一個文件,heap如果比較大的話,就會導致這個過程比較耗時,并且執行的過程中為了保證dump的信息是可靠的,所以會暫停應用。jmap -clstats
這個命令執行,JVM會去統計classloader信息,這整個過程也會比較的耗時,并且同樣也會暫停應用jmap -histo:live
這個命令執行,JVM會先觸發gc,然后再統計信息。
二、Jstack
jstack [option] pid
(一) 參數
-F 強制打印堆棧
-m 打印java 和 native(C++) 堆棧信息
-l 打印額外的信息,包括鎖信息
(二) 案例
1、獲取某個線程的堆棧信息
jstack pid > jstack.txt
2、定位消耗CPU最多的線程
https://mp.weixin.qq.com/s/c-KuGjI_VH1dTxIWtxZJEg
3、IBM工具使用分析線程堆棧信息
https://www.ibm.com/developerworks/cn/java/j-java8idioms1/index.html
(三) 注意
- 使用jstack打印堆棧的時候,會中斷服務,導致短時間類服務不可用
三、Jstat
jstat -<option> <vmid> [<interval> [<count>]]
jstat [-命令選項] [vmid] [間隔時間/毫秒] [查詢次數]
(一) 參數
-
option 選項
-class: 類加載器的統計信息
-compiler: JIT編譯的統計信息
-gc: 垃圾回收統計
-gccapacity: 堆內存統計
-gccause: 產生GC的原因
-gcnew: 新生代垃圾回收統計
-gcnewcapacity: 新生代內存統計
-gcold: 老年代垃圾回收統計
-gcoldcapacity: 老年代內存統計
-gcmetacapacity: 元數據空間統計
-gcutil: 垃圾收集統計信息
-printcompilation: JVM編譯方法統計
-t 參數可以在輸出信息前加上一列timestamp,表示程序運行的時間
-h 參數可以指定周期性數據輸出時,輸出多少行數據后,輸出一個表頭信息
interval 參數用戶指定輸出統計數據的周期,單位為毫秒
count 參數用戶指定一共輸出多少次數據
(二) 案例
(三) 推薦
http://lovestblog.cn/blog/2016/07/20/jstat/
參數
-XX:+HeapDumpOnOutOfMemoryError 虛擬機出現OOM的時候自動生成dump文件
推薦參數
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/log/gclog/
-Xloggc:/data/log/gclog/gc.log
Shell命令
1、查看進程執行的時間
ps -p pid -o etime
2、查看java線程
ps -ef | grep java | grep -v "grep"
3、獲取消耗CPU最多的線程
top -Hp pid
擴展
命令幫助中出現的[] <>含義
在查看命令幫助時,會出現[],<>,|等符號,它們的含義如下:
[] 表示是可選的;
<> 表示是可變化的;
x|y|z 表示只能選擇一個;
-abc 表示三個參數(或任何二個)的混合使用