JVM常用調優引數

daheww發表於2022-12-21

JVM記憶體模型及常用引數

JVM常用調優引數

引數解釋

  1. -XX:SurvivorRatio:新生代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:為3,表示Eden:Survivor=3:2,一個Survivor區佔整個新生代的1/5
  2. -XX:TargetSurvivorRatio:物件動態年齡判斷:當前放物件的Survivor區域中一批物件的總大小大於這塊Survivor區域記憶體大小的50%,那麼此時大於等於這批物件年齡最大值的物件,就可以直接進入老年代了
  3. -XX:-HandlerPromotionFailure:老年代空間分配擔保機制:Minor GC後JVM會算一下老年代剩餘的可用空間。如果可用空間小於年輕代中所有物件大小之和(包括垃圾物件)。則會看是否設定了-XX:-HandlerPromotionFailure(1.8預設設定了)引數

垃圾收集器

JVM常用調優引數

Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)

  • 新生代採用複製演算法,老年代採用標記-整理演算法

Parallel Scavenge收集器(-XX:+UseParallelGC -XX:+UseParallelOldGC)

  • Parallel收集器其實就是Serial收集器的多執行緒版本
  • Parallel Scavenge收集器關注點是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的關注點更多的是使用者執行緒的停頓時間(提高使用者體驗)。所謂吞吐量就是CPU中用於執行使用者程式碼的時間與CPU總消耗時間的比值
  • 新生代採用複製演算法,老年代採用標記-整理演算法

ParNew收集器(-XX:+UseParNewGC) + CMS收集器(-XX:+UseConcMarkSweepGC)

  • 垃圾收集執行緒與使用者執行緒(基本上)同時工作
  • 新生代採用複製演算法,老年代採用標記-清除演算法
  • ParNew:
    • ParNew收集器其實跟Parallel收集器很類似,區別主要在於它可以和CMS收集器配合使用
  • CMS:
    • 優點:
      • 併發收集、低停頓
    • 缺點:
      1. 對CPU資源敏感(會和服務搶資源);
      2. 無法處理浮動垃圾(在併發標記和併發清理階段又產生垃圾,這種浮動垃圾只能等到下一次gc再清理了);
      3. 它使用的回收演算法-“標記-清除”演算法會導致收集結束時會有大量空間碎片產生,當然透過引數-XX:+UseCMSCompactAtFullCollection可以讓jvm在執行完標記清除後再做整理
        執行過程中的不確定性,會存在上一次垃圾回收還沒執行完,然後垃圾回收又被觸發的情況,特別是在併發標記和併發清理階段會出現,一邊回收,系統一邊執行,也許沒回收完就再次觸發full gc,也就是"concurrent mode failure",此時會進入stop the world,用serial old垃圾收集器來回收

垃圾回收統計資訊

-Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M

  • -XX:+PrintGC:輸出簡要GC日誌
  • -XX:+PrintGCDetails:輸出詳細GC日誌
  • -Xloggc:filename:輸出GC日誌到檔案
  • -XX:+PrintGCTimeStamps:輸出GC的時間戳(JVM啟動到當前的總時長的時間戳形式)
  • -XX:+PrintGCTimeStamps:輸出GC的時間戳(以日期的形式)
  • -XX:+PrintHeapAtGC:在進行GC的前後列印出堆的資訊
  • -XX:+PrintGCCause:列印造成垃圾收集的原因
  • -XX:+UseGCLogFileRotation
  • -XX:NumberOfGCLogFiles
  • -XX:GCLogFileSize

CMS的相關核心引數

  • -XX:+UseConcMarkSweepGC:啟用cms
  • -XX:ConcGCThreads:併發的GC執行緒數
  • -XX:+UseCMSCompactAtFullCollection:FullGC之後做壓縮整理(減少碎片)
  • -XX:CMSFullGCsBeforeCompaction:多少次FullGC之後壓縮一次,預設是0,代表每次FullGC後都會壓縮一次
  • -XX:CMSInitiatingOccupancyFraction:當老年代使用達到該比例時會觸發FullGC(預設是92,這是百分比)
  • -XX:+UseCMSInitiatingOccupancyOnly:只使用設定的回收閾值(-XX:CMSInitiatingOccupancyFraction設定的值),如果不指定,JVM僅在第一次使用設定值,後續則會自動調整
  • -XX:+CMSScavengeBeforeRemark:在CMS GC前啟動一次minor gc,降低CMS GC標記階段(也會對年輕代一起做標記,如果在minor gc就幹掉了很多對垃圾物件,標記階段就會減少一些標記時間)時的開銷,一般CMS的GC耗時 80%都在標記階段
  • -XX:+CMSParallellnitialMarkEnabled:表示在初始標記的時候多執行緒執行,縮短STW
  • -XX:+CMSParallelRemarkEnabled:在重新標記的時候多執行緒執行,縮短STW

附:相關文章

JVM調優思路

相關文章