1. 程式人生 > >JVM引數,jmap列印堆快照,jstack實戰死鎖

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

在檔案末尾,我們就可以看到明顯的死鎖資訊。