您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么使用JVM調優技術”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
查看實例個數以及占用內存信息,最后一位表示進程id,可以用jps命令查看
jmap -histo pid
num:代表序號 instances:代表實例數量 bytes:代表占用空間大小 classname:代表類的名稱
查看堆的使用情況:
jmap -heap pid
通過該命令可以看到垃圾回收器,堆的參數以及堆的使用情況等信息。
堆內存dump
jmap -dump:format=b,file=D:/demo.hprof pid
通過命令將JVM運行文件拷貝出來,生成dump文件后,可以用JDK自帶的可視化分析工具分析它,命令行下輸入
jvisualvm
自動打開一個可視化窗口,將我們生成的文件裝入:
所有信息都可以在可視化頁面中看到
通過Jvm參數可設置內存溢出后自動導出Dump文件:
-XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dump
通過Jstack命令加進程的id即可查找死鎖,首先寫一段代碼制造一個死鎖
public class DeadLockTest { public static Object lock1=new Object(); public static Object lock2=new Object(); public static void main(String[] args) { new Thread(()->{ synchronized (lock1){ try { System.out.println(Thread.currentThread().getName()+"begin"); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } synchronized (lock2){ System.out.println(Thread.currentThread().getName()+"end"); } } }).start(); new Thread(()->{ synchronized (lock2){ try { System.out.println(Thread.currentThread().getName()+"begin"); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } synchronized (lock1){ System.out.println(Thread.currentThread().getName()+"end"); } } }).start(); } }
這段代碼會制造第一個線程鎖住lock1等待鎖lock2,第二個線程鎖住lock2等待鎖lock1的死鎖。
首先通過jps命令查到進程號,我這里是15820,接著使用jstack命令:
jstack 15820
通過該命令可以很輕松地找到死鎖。
查看正在運行的Java項目參數 查看jvm的參數:
jinfo -flags pid
可以查看到jvm的所有參數
查看Java系統參數
jinfo -sysprops pid
可以查看到JDK版本、位置等信息。
可視化的JVM監控工具,上面所講到的這些命令,都可以直接在jvisualvm中看到可視化數據,但是這個工具在生產環境中需要謹慎使用,因為會占用一定資源。
jstat其實也是JVM自帶的一個調優工具,但是我這里把他單獨拿出來是因為正式對JVM調優中,這條命令是最常用的。
jstat命令可以查看堆內存各部分的使用量,以及加載類的數量等。
評估內存使用及GC壓力情況
jstat -gc pid
我執行這段代碼后,出現了一串數據
所有參數的解釋都放在下面了,結合垃圾回收一起看,就能懂了。
S0C:第一個Survivor大小(kb) S1C:第二個Survivor大小 S0U:第一個Survivor區的使用大小 S1U:第二個Survivor區的使用大小 EC:eden區大小 EU:eden區的使用大小 OC:老年代大小 OU:老年代使用大小 MC:方法區大小(元空間) MU:方法區使用大小 CCSC:壓縮類空間大小 CCSU:壓縮類空間使用大小 YGC:YoungGC次數 YGCT:YoungGC時間(s) FGC:FullGC次數 FGCT:FullGC時間(s) GCT:總的GC時間(s)
給出各個區的使用比例:
jstat -gcutil pid
參數介紹:
S0:第一個Survivor區當前使用比例 S1:第二個Survivor區當前使用比例 E:eden區使用比例 O:老年代使用比例 M:元數據區使用比例 CCS:壓縮使用比例 YGC:YoungGC次數 FGC:FullGC次數 FGCT:FullGC消耗時間 GCT:垃圾回收消耗總時間
統計堆內存的使用情況
jstat -gccapacity pid
介紹一下參數:
NGCMN:新生代最小容量 NGCMX:新生代最大容量 NGC:當前新生代容量 S0C:第一個Survivor區大小 S1C:第二個Survivor區的大小 EC:eden區的大小 OGCMN:老年代最小容量 OGCMX:老年代最大容量 OGC:當前老年代大小 OC:當前老年代大小 MCMN:最小元數據容量 MCMX:最大元數據容量 MC:當前元數據空間大小 CCSMN:最小壓縮類空間大小 CCSMX:最大壓縮類空間大小 CCSC:當前壓縮類空間大小 YGC:YoungGC次數 FGC:FullGC次數
統計新生代垃圾回收的數據
jstat -gcnew pid
介紹參數:
S0C:第一個Survivor區的大小 S1C:第二個Survivor區的大小 S0U:第一個Survivor區的使用大小 S1U:第二個Survivor區的使用大小 TT:對象在新生代存活的次數 MTT:對象在新生代存活的最大次數 DSS:期望的幸存區大小 EC:eden區的大小 EU:eden區的使用大小 YGC:年輕代垃圾回收次數 YGCT:年輕代垃圾回收消耗時間
統計新生代內存的使用情況
jstat -gcnewcapacity pid
介紹參數:
NGCMN:新生代最小容量 NGCMX:新生代最大容量 NGC:當前新生代容量 S0CMX:第一個Survivor區最大容量 S0C:第一個Survivor區大小 S1CMX:第二個Survivor區最大容量 S1C:第二個Survivor區大小 ECMX:eden區最大容量 EC:當前eden區大小 YGC:年輕代垃圾回收次數 FGC:老年代回收次數
統計老年代垃圾回收的數據
jstat -gcold pid
參數介紹:
MC:方法區大小 MU:方法區使用大小 CCSC:壓縮類空間大小 CCSU:壓縮類空間使用大小 OC:老年代大小 OU:老年代使用大小 YGC:年輕代垃圾回收次數 FGC:老年代垃圾回收次數 FGCT:老年代垃圾回收消耗時間 GCT:垃圾回收消耗總時間
統計老年代內存的使用情況
jstat -gcoldcapacity pid
參數介紹:
OGCMN:老年代最小容量 OGCMX:老年代最大容量 OGC:當前老年代大小 OC:老年代大小 YGC:年輕代垃圾回收次數 FGC:老年代垃圾回收次數 FGCT:老年代垃圾回收消耗時間 GCT:垃圾回收消耗總時間
統計元數據空間的情況
jstat -gcmetacapacity pid
參數介紹
MCMN:最小元數據容量 MCMX:最大元數據容量 MC:當前元數據空間大小 CCSMN:最小壓縮類空間大小 CCSMX:最大壓縮類空間大小 CCSC:當前壓縮類空間大小 YGC:年輕代垃圾回收次數 FGC:老年代垃圾回收次數 FGCT:老年代垃圾回收消耗時間 GCT:垃圾回收消耗總時間
上面的這些知識調優的工具,我們除了要了解這些工具的含義之外,還需要知道這些如何使用這些工具去分析JVM的運行情況。
我們都知道新對象的產生會在eden區,因此我們可以通過下面的命令:
jstat -gc pid 5000 10
每5秒執行一次,執行10次,然后觀察這50秒內eden區增加的趨勢,即可知道年輕代對象增長的速率。
jstat -gc命令中展示了YGCT和YGC,通過YGCT/YGC可以算出YGC的平均耗時。通過每隔一段時間輸出一次我們也能觀察出YGC的頻率。
每次YGC過后,eden區數量會大幅減少,而survivor和老年代的數量會增加,這樣我們就能計算出每次每次YGC后存活的對象數量,以及推斷老年代對象增長的速率。
分析FGC的思路和分析YGC一樣,通過增長速率推斷FGC頻率,通過計算FGCT/FGC計算平均每次FGC耗時。
優化思路在于:盡量減少FGC的次數,避免頻繁FGC對JVM性能的影響,因此盡量別讓對象進入老年代,也就是每次YGC后存活的對象盡量少于Survivor的50%。
有時候系統突然運行緩慢無法找到原因時,我們可以把GC日志都打印出來,然后去分析gc日志中的關鍵性指標。
通過增加JVM參數的方式打印gc日志:
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./gc.log
GC日志中會把每一次GC的情況都打印出來,因此所有的GC都可以被分析到。
在GC日志中,有關GC日志的參數,我接下來也會專門寫一篇來介紹,這樣更加能讓大家更加清楚一些。
我們還可以用一些工具比如GCeasy幫助我們去分析GC日志的情況。
“怎么使用JVM調優技術”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。