JVM引數,jmap列印堆快照,jstack實戰死鎖
1 jinfo指令:如何執行時檢視引數值
jinfo -flag MaxHeapSize 23789(檢視最大堆:23789即執行緒id)
jinfo -flag ThreadStackSize 23789(查詢執行緒棧大小:預設值1024)
2 檢視jvm執行時引數
(1)-XX:+PrintFlagsInitial 檢視初始值
=表示預設值
:=被使用者或者JVM修改後的值
(2)-XX:+PrintFlagsFinal表示打印出執行時引數生效的值
-XX:+UnlockExperimentalVMOptions解鎖實驗引數(並非所有的引數都可以直接修改)
(3)jps
jps是用於檢視有權訪問的hotspot虛擬機器的程序. 當未指定hostid時,預設檢視本機jvm程序,否者檢視指定的hostid機器上的jvm程序,此時hostid所指機器必須開啟jstatd服務。 jps可以列出jvm程序lvmid,主類類名,main函式引數, jvm引數,jar名稱等資訊。
(4)jinfo -flag 23789(檢視tomcat程序23789執行時jvm引數)
jinfo -flag UseParallelGC 23789
jinfo -flag UseG1GC 23789
jinfo -flag UseConcMarkSweepGC 23789
(5)jstat 檢視JVM統計資訊,例如類載入資訊、垃圾收集、JIT編譯
jstat -class 23789 載入了多少個類,佔用多少Kb,解除安裝多少個,平臺解除安裝載入所花費時間
jstat -gc 23789
jstat -gc 23789 1000 10 (每個1秒列印gc資訊,共列印10次)
Metaspace裡面有ccs, CodeCache等ccs表示啟用指向自己類檔案的短指標的時候就會存在ccs。CodeCache:存放jit編譯程式碼資訊。把java程式碼轉化為native程式碼。
(6)jmap+MAT實戰記憶體溢位
①匯出記憶體對映檔案:
自動匯出:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
jmap命令手動匯出:jmap -dump:format=b,file=heap.hprof 23789
我們實驗的時候在eclipse debug新增引數:-Xms23m -Xmx23m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
②匯入mat中分析:
File -> openFile ->匯入自己的檔案heap.hprof
檢視可能存在記憶體溢位:
檢視類佔用記憶體大小
正則匹配檢視我們的類佔用記憶體大小(shallow heap不包括其內部引用物件大小)
(7)jstack 檢視執行緒
jstack 23789 > 23789.txt
注意: top命令檢視pid是十進位制的,printf “%x” 23789 就將23789轉化為16進位制5ced。然後在23789.txt中搜索ox5ced,就能找到pid對應的類資訊
死迴圈案例分析:
private Object lock1 = new Object(); private Object lock2 = new Object(); public String deadlock() { new Thread(() -> { synchronized(lock1) { synchronized(lock1) {System.out.println(“Thread1 get lock1”)} try{Thread.sleep(5000);}cache(Exception e){} synchronized(lock2) {System.out.println(“Thread1 get lock2”)} } }).start(); new Thread(() -> { synchronized(lock2) { synchronized(lock1) {System.out.println(“Thread2 get lock2”)} try{Thread.sleep(5000);}cache(Exception e){} synchronized(lock1) {System.out.println(“Thread2 get lock1”)} } }).start(); } |
jstack 執行緒id > 執行緒id.txt
在檔案末尾,我們就可以看到明顯的死鎖資訊。