JVM常用調優工具介紹

 

前言

王子在之前的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垃圾回收器

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章