JVM記憶體分析
JDK常用內建工具堆疊分析1
- jps:檢視當前JVM中執行程序
- jstack:列印執行緒堆疊資訊
- jstat:JVM監控統計資訊,包括類的載入和解除安裝情況,新生代和老年代的容量、使用情況等資訊
- jmap:列印JVM堆內物件情況
定位pid使用
方法1:直接輸入jps
(檢視當前使用者java相關所有程序號)
方法2:ps -ef | grep [javaname]
檢視pid
檢視佔用CPU高的執行緒
1.使用top 定位到佔用CPU高的程序PID
# top
# ps aux | grep PID
jstack使用
2.獲取執行緒資訊,並找到佔用CPU高的執行緒
ps -mp pid -o THREAD,tid,time | sort -rn
3.將需要的執行緒ID轉換為16進位制格式
printf "%x\n" tid
4.列印執行緒的堆疊資訊
jstack pid |grep tid -A 30
jstat使用
JVM監控統計資訊,包括類的載入和解除安裝情況,新生代和老年代的容量、使用情況等資訊。統計維度比較多:
-class -compiler -gc -gccapacity -gccause -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -printcompilation 具體日誌輸出含義,看手冊
jmap使用
jmap -dump:live,format=b,file=< filename> pid
列印JVM堆內物件情況,常用引數有:(具體描述見手冊)
-dump:[live,]format=b,file=< filename>
使用hprof二進位制形式,輸出jvm的heap內容到檔案=. live子選項是可選的,假如指定live選項,那麼只輸出活的物件到檔案。
-finalizerinfo
列印正等候回收的物件的資訊。
-heap
列印heap的概要資訊,GC使用的演算法,heap的配置及wise heap的使用情況。
-histo[:live]
列印每個class的例項數目、記憶體佔用、類全名資訊。VM的內部類名字開頭會加上字首“*”。如果live子引數加上後,只統計活的物件數量。
-clstats
列印classload的資訊。包含每個classloader的名字、活潑性、地址、父classloader和載入的class數量。
-F
在pid沒有響應的時候強制使用-dump或者-histo引數。在這個模式下,live子引數無效。
分析記憶體佔用mat工具使用 檢視
參考部落格: https://blog.csdn.net/weitry/article/details/53284586 ↩︎