一、Serial收集器
單線程收集器,只會使用一條垃圾收集線程去完成垃圾收集工作,在進行垃圾收集工作的時候,必須暫停其他所有的工作線程(Stop The World),直到收集結束。
-XX:+UseSerialGC -XX:+UseSerialOldGC
二、Parallel Scavenge收集器
Parallel收集器其實就是Serial收集器的多線程版本,除了使用多線程進行垃圾收集外,其余行為(控制參數、收集算 法、回收策略等等)和Serial收集器類似。默認的收集線程數跟cpu核數相同,當然也可以用參數(- XX:ParallelGCThreads)指定收集線程數,但是一般不推薦修改。
Parallel Scavenge收集器關注點是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的關注點更多的是用戶線程的停 頓時間(提高用戶體驗)。所謂吞吐量就是CPU中用于運行用戶代碼的時間與CPU總消耗時間的比值。
Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多線程和“標記-整理”算法。在注重吞吐量以及 CPU資源的場合,都可以優先考慮 Parallel Scavenge收集器和Parallel Old收集器(JDK8默認的新生代和老年代收集 器)。
-XX:+UseParallelGC(年輕代),-XX:+UseParallelOldGC(老年代)
三、ParNew收集器
ParNew收集器其實跟Parallel收集器很類似,區別主要在于它可以和CMS收集器配合使用。
-XX:+UseParNewGC
四、CMS收集器
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。它非常符合在注重用戶體 驗的應用上使用,它是HotSpot虛擬機第一款真正意義上的并發收集器,它第一次實現了讓垃圾收集線程與用戶線程 (基本上)同時工作。
# CMS的相關核心參數
1. -XX:+UseConcMarkSweepGC:啟用cms
2. -XX:ConcGCThreads:并發的GC線程數
3. -XX:+UseCMSCompactAtFullCollection:FullGC之后做壓縮整理(減少碎片)
4. -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后壓縮一次,默認是0,代表每次FullGC后都會壓縮一 次
5. -XX:CMSInitiatingOccupancyFraction: 當老年代使用達到該比例時會觸發FullGC(默認是92,這是百分比) 6. -XX:+UseCMSInitiatingOccupancyOnly:只使用設定的回收閾值(-XX:CMSInitiatingOccupancyFraction設 定的值),如果不指定,JVM僅在第一次使用設定值,后續則會自動調整
7. -XX:+CMSScavengeBeforeRemark:在CMS GC前啟動一次minor gc,目的在于減少老年代對年輕代的引 用,降低CMS GC的標記階段時的開銷,一般CMS的GC耗時 80%都在標記階段
8. -XX:+CMSParallellnitialMarkEnabled:表示在初始標記的時候多線程執行,縮短STW
9. -XX:+CMSParallelRemarkEnabled:在重新標記的時候多線程執行,縮短STW;