前言
王子在之前的JVM文章中已經大體上把一些原理性問題說清楚了,今天主要是介紹一些實際進行JVM調優工作的工具和命令,不會深入講解,因為網上資料很多,篇幅可能不長,但都是實用的內容,小夥伴們有不清楚的可以自行查詢資料。
jstat命令
jstat命令可以檢視到很多的jvm資訊,詳細內容可以自行百度,本篇只介紹我們經常使用的命令。
jstat -gc PID 1000 10
一般最常用的命令就是這個了,它的意思是每1秒列印一次jvm的記憶體資訊,列印10次。
通過此命令可以分析出新生代物件的增長速度,Young GC的觸發頻率和耗時、老年代的增長速度、Full GC的觸發頻率和耗時。
分析之後進行合理的jvm引數設定進行調優工作。
裡面的各個引數解釋如下:
- S0C:第一個倖存區的大小
- S1C:第二個倖存區的大小
- S0U:第一個倖存區的使用大小
- S1U:第二個倖存區的使用大小
- EC:伊甸園區的大小
- EU:伊甸園區的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法區大小
- MU:方法區使用大小
- CCSC:壓縮類空間大小
- CCSU:壓縮類空間使用大小
- YGC:年輕代垃圾回收次數
- YGCT:年輕代垃圾回收消耗時間
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
PID可以通過jps命令獲得,jps就是一個檢視java程式的命令,沒什麼可說的,不清楚的小夥伴百度瞭解下即可。
jmap和jhat命令
jmap -dump:live,format=b,file=dump.hprof PID
生成記憶體快照,以供分析記憶體佔用情況。
jhat dump.hprof
分析記憶體快照,內建了web容器,可以通過瀏覽器分析堆記憶體快照。
MAT工具
功能比較強大的記憶體分析工具,可以替代jhat。
需要注意的一點是,線上匯出來的dump如果很大的話,比如有幾個GB,使用MAT之前需要修改MemoryAnalyzer.ini檔案,修改堆記憶體的大小足夠容納你的dump檔案
常用的監控系統
一般我們可以配置一套自動化監控系統,如果發現JVM出現異常,可以報警,比如傳送簡訊或郵件給負責人。
常用的有Zabbix,Ganglla,Open-Falcon,Prometheus。
如果想要引入一套監控系統,可以自行了解以上監控系統,在其中選擇一個。
一套JVM調優的引數模板
以下是王子在jvm調優工作中總結的常用調優引數,在這裡分享給小夥伴們,一般合理的配置以下引數就可以獲得一個比較好的效能
-Xms2048m | 初始堆大小 |
-Xmx2048m | 最大堆大小 |
-Xmn1024m | 年輕代大小 |
-XX:PermSize=256m | 設定持久代(perm gen)初始值(JDK8以後棄用改為-XX:MetaspaceSize) |
-XX:MaxPermSize=256m | 設定持久代最大值(JDK8以後棄用改為-XX:MaxMetaspaceSize) |
-Xss1m | 每個執行緒的堆疊大小(等價於-XX:ThreadStackSize) |
-XX:SurvivorRatio | Eden區與Survivor區的大小比值(預設為8) |
-XX:+DisableExplicitGC | 關閉System.gc(),如果系統中使用了nio呼叫堆外記憶體,慎用此引數 |
-XX:MaxTenuringThreshold=15 | 年輕代垃圾回收最大年齡,預設15,15次後進入老年代 |
-XX:PretenureSizeThreshold | 物件超過多大直接在老年代分配 |
-XX:+UseParNewGC | 使用ParNewGC垃圾回收器 |
-XX:+UseConcMarkSweepGC | 使用CMS記憶體收集 |
-XX:CMSInitiatingOccupancyFraction=92 | CMS垃圾收集器,當老年代達到92%時,觸發CMS垃圾回收 |
-XX:CMSFullGCsBeforeCompaction=0 | 多少次後進行記憶體壓縮,預設0 |
-XX:+CMSScavengeBeforeRemark |
CMS重新標記之前儘量進行一次Young GC |
-XX:+UseCMSCompactAtFullCollection | 在FULL GC的時候, 對老年代的壓縮,預設開啟 |
-XX:+CMSParallelInitialMarkEnabled | CMS初始標記並行化,增加初始標記速度 |
-Xverify:no | 禁止位元組碼校驗,提高編譯速度(jdk13之後作廢,生產環境不使用) |
-XX:+UseG1GC | 使用G1垃圾回收器 |
-XX:MaxGCPauseMillis=200 | 目標GC暫停時間,儘可能目標 |
-XX:+PrintGCTimeStamps |
合併使用,列印GC資訊到指定檔案 |
-XX:+HeapDumpOnOutOfMemoryError |
表示當JVM發生OOM時,自動生成DUMP檔案 |
-XX:HeapDumpPath=${目錄} |
表示生成DUMP檔案的路徑,也可以指定檔名稱,例如:-XX:HeapDumpPath=${目錄}/java_heapdump.hprof。如果不指定檔名,預設為:java_<pid>_<date>_<time>_heapDump.hprof |
總結
到這裡本篇文章就結束了,關於JVM部分的文章可能暫時也結束了,下邊的話是一些經驗之談。
如何具體的做好JVM調優不是簡簡單單的一篇文章就能說得清的,不要相信什麼網上的萬能jvm調優模板,王子提供的模板也只是常用的一些調優引數,一切的調優都需要通過分析實際生產環境情況後,才能做出最適合生產環境的調優方案,真正能證明你價值的地方就在於你的分析並處理問題的能力,而不是說你懂了JVM的原理就可以了,JVM原理只是基礎,能把它實際運用才能稱它為價值!
如果想成為一個JAVA高階工程師甚至架構師,JVM調優是必備技能之一,需要小夥伴們經過大量真實的調優工作後才會有所心得,這個就要靠大家自己去實踐了。
如果有小夥伴感興趣,王子可以接著寫一些實踐場景的文章,這個是後話了。
本文主要是提供了一些工具和命令的介紹,並提供了常用的JVM調優引數,它們是你實踐的開始。
也歡迎小夥伴們留言說出你的想法。
往期文章推薦: