目錄
JVM記憶體模型及常用引數
引數解釋
-XX:SurvivorRatio
:新生代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:為3,表示Eden:Survivor=3:2,一個Survivor區佔整個新生代的1/5-XX:TargetSurvivorRatio
:物件動態年齡判斷:當前放物件的Survivor區域中一批物件的總大小大於這塊Survivor區域記憶體大小的50%,那麼此時大於等於這批物件年齡最大值的物件,就可以直接進入老年代了-XX:-HandlerPromotionFailure
:老年代空間分配擔保機制:Minor GC後JVM會算一下老年代剩餘的可用空間。如果可用空間小於年輕代中所有物件大小之和(包括垃圾物件)。則會看是否設定了-XX:-HandlerPromotionFailure
(1.8預設設定了)引數
垃圾收集器
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:
- 優點:
- 併發收集、低停頓
- 缺點:
- 對CPU資源敏感(會和服務搶資源);
- 無法處理浮動垃圾(在併發標記和併發清理階段又產生垃圾,這種浮動垃圾只能等到下一次gc再清理了);
- 它使用的回收演算法-“標記-清除”演算法會導致收集結束時會有大量空間碎片產生,當然透過引數-XX:+UseCMSCompactAtFullCollection可以讓jvm在執行完標記清除後再做整理
執行過程中的不確定性,會存在上一次垃圾回收還沒執行完,然後垃圾回收又被觸發的情況,特別是在併發標記和併發清理階段會出現,一邊回收,系統一邊執行,也許沒回收完就再次觸發full gc,也就是"concurrent mode failure",此時會進入stop the world,用serial old垃圾收集器來回收
- 優點:
垃圾回收統計資訊
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
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