首頁>技術>

序列收集器

stop the world
新生代序列收集器新生代序列收集器使用的是 複製演算法使用 -XX:UseSerialGC , -XX:+UseConcMarkSweepGC -XX:-UseParNew 啟用GC 日誌如下所示
[GC (Allocation Failure) [DefNew: 67932K->0K(78720K), 0.0002327 secs] 68792K->859K(253504K), 0.0002491 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
老年代序列收集器老年代序列收集器使用的是 標記-壓縮演算法使用 -XX:UseSerialGC 、 -XX:+UseParNewGC 啟用GC 日誌如下
[Full GC (Allocation Failure) [Tenured: 10250K->10249K(15360K), 0.0187416 secs] 10250K->10249K(19968K), [Metaspace: 9228K->9228K(1058816K)], 0.0187608 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
並行收集器ParNew新生代垃圾回收器新生代序列收集器的多執行緒版本與新生代序列收集器的區別僅在於垃圾回收時,是多執行緒並行。使用 -XX:UseParNew 、 -XX:UseConcMarkSweepGC 啟用GC 日誌如下
[GC (Allocation Failure) [ParNew: 82K->24K(4608K), 0.0003178 secs][Tenured: 15353K->10251K(15360K), 0.0185459 secs] 15435K->10251K(19968K), [Metaspace: 8855K->8855K(1056768K)], 0.0188925 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
ParallelGC新生代垃圾回收器,使用 複製演算法與 ParNew 相比, ParallelGC 更關注吞吐量-XX:MaxGCPauseMillis :設定最大垃圾停頓時間。例: -XX:MaxGCPauseMillis=200-XX:GCTimeRatio :設定吞吐量大小。取值範圍為 0~100 的整數。若值為 n ,那麼 JVM 將花費不超過 1/(1+n) 的時間在 GC 上。例: -XX:GCTimeRatio=99-XX:+UseAdaptiveSizePolicy :自適應調整 新生代大小、eden 和 survivor 比例,以及晉升老年代物件年齡等引數可透過 -XX:+UseParallelGC 、 -XX:+UseParallelOldGC 啟用GC 日誌如下
[GC (Allocation Failure) [PSYoungGen: 2410K->512K(4608K)] 12650K->10947K(19968K), 0.0016662 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
ParallelOldGC老年代垃圾回收器,使用 標記-壓縮演算法與 ParallelGC 一致, 關注系統吞吐量 , ParallelOldGC 在 jdk1.6 後(包括) 才可以使用-XX:ParalleGCThreads :設定 GC 時,並行的執行緒數可透過 -XX:+UseParallelGC 、 -XX:+UseParallelOldGC 啟用GC 日誌如下
[Full GC (Allocation Failure) [PSYoungGen: 480K->0K(4608K)] [ParOldGen: 10499K->626K(15360K)] 10979K->626K(19968K), [Metaspace: 3063K->3063K(1056768K)], 0.0043604 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
CMS

CMS 是一款 低停頓老年代 垃圾收集器。一般與 Serial , ParNew 新生代收集器一起工作,預設是 ParNew 。

工作流程細化為以下幾個步驟

stop the worldstop the worldCMS
初始化標記
stop the worldGC Root
併發標記與應用執行緒 併發執行 ,從上一步標記的節點順著引用鏈路往下標記併發標記過程中,老年代會產生新的物件、老年代引用會變更等等。為了提高重新標記的效率,這些物件所在的 card 會被標記為 dirty 。這一階段,可能會導致 concurrent mode failure預清理

與應用執行緒 併發執行 ,處理上一個階段被標記為 dirty 的物件。該階段為了減少 重新標記 產生的停頓時間, 有可能 會等待一次 ygc

重新標記stop the world從 dirty 和 root 繼續往下標記可達物件併發清理與應用執行緒 併發執行採用 標記-清除 演算法將垃圾清除concurrent mode failure

在併發清理階段,提到,有可能會發生 concurrent mode failure 現象。

出現該現象的本質原因如下:

老年代沒有足夠的空間分配物件,從而導致使用 Serial Old 垃圾收集器觸發一次 Full GC

主要引數-XX:ConcGCThreads, -XX:ParallelCMSThreads CMS 預設啟動的併發執行緒是 (ParallelGCThreads + 3)/ 4 . ParallelGCThreads 表示新生代 GC 執行緒數量。 -XX:ConcGCThreads -XX:ParallelCMSThreads 可手動指定 CMS 併發執行緒-XX:+CMSScavengeBeforeRemark 在進行 重新標記 階段時,會執行一次 ygc-XX:CMSInitiatingOccupancyFraction 預設68,當老年代空間使用率達到該值時,會執行一次 CMS GC-XX:+UseCMSCompactAtFullCollection 使 CMS 在垃圾收集完成後,進行一次記憶體碎片整理,碎片整理會 stop the world 。-XX:CMSFullGCsBeforeCompaction 預設0,設定進行多少次 CMS 回收後,進行一次記憶體壓縮-XX:CMSMaxAbortablePrecleanTime 預設 5000 毫秒,預清理階段,等待 ygc 最大時間-XX:+CMSClassUnloadingEnabled 允許回收 Class垃圾回收器組合

筆者無法在 jdk1.8 上,測試出 serial + parallel old 組合。

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 原始碼第一步,當然是搞清楚Spring事件機制呀