JVM常用調優工具介紹

王子發表於2020-11-11

 

前言

王子在之前的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
-XX:+PrintGCDetails
-Xloggc:d:\idea_gc.log

合併使用,列印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調優引數,它們是你實踐的開始。

也歡迎小夥伴們留言說出你的想法。

 

往期文章推薦:

大白話談JVM的類載入機制

JVM記憶體模型不再是祕密

輕鬆理解JVM的分代模型

秒懂JVM的垃圾回收機制

探索ParNew和CMS垃圾回收器

探索G1垃圾回收器

 

相關文章