JVM GC算法 垃圾回收器
阿新 • • 發佈:2017-06-28
com 修正 可用 mark 信息 網站 最長 style 互聯網 JVM的垃圾回收算法有三種:
1.標記-清除(mark-sweep):啥都不說,直接上圖
2.標記-整理(mark-compact)
3.復制(copy)
Serial收集器
串行收集器是最古老,最穩定以及效率高的收集器,可能會產生較長的停頓,只使用一個線程去回收。
新生代、老年代使用串行回收;新生代復制算法、老年代標記-壓縮;垃圾收集的過程中會Stop The World(服務暫停)
參數控制:-XX:+UseSerialGC 串行收集器
Parallel收集器
Parallel Scavenge收集器類似ParNew收集器,Parallel收集器更關註系統的吞吐量。可以通過參數來打開自適應調節策略,虛擬機會根據當前系統的運行情況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間或最大的吞吐量;
也可以通過參數控制GC的時間不大於多少毫秒或者比例;
新生代復制算法、老年代標記-壓縮
參數控制:-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很大一部分的Java應用都集中在互聯網站或B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。
從名字(包含“Mark Sweep”)上就可以看出CMS收集器是基於“標記-清除”算法實現的,它的運作過程相對於前面幾種收集器來說要更復雜一些,整個過程分為4個步驟,包括:
初始標記(CMS initial mark)
並發標記(CMS concurrent mark)
重新標記(CMS remark)
並發清除(CMS concurrent sweep)
其中初始標記、重新標記這兩個步驟仍然需要“Stop The World”。初始標記僅僅只是標記一下GC Roots能直接關聯到的對象,速度很快,並發標記階段就是進行GC Roots Tracing的過程,而重新標記階段則是為了修正並發標記期間,因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比並發標記的時間短。
由於整個過程中耗時最長的並發標記和並發清除過程中,收集器線程都可以與用戶線程一起工作,所以總體上來說,CMS收集器的內存回收過程是與用戶線程一起並發地執行。老年代收集器(新生代使用ParNew)
優點:並發收集、低停頓
缺點:產生大量空間碎片、並發階段會降低吞吐量
參數控制:-XX:+UseConcMarkSweepGC 使用CMS收集器
-XX:+ UseCMSCompactAtFullCollection Full GC後,進行一次碎片整理;整理過程是獨占的,會引起停頓時間變長
-XX:+CMSFullGCsBeforeCompaction 設置進行幾次Full GC後,進行一次碎片整理
-XX:ParallelCMSThreads 設定CMS的線程數量(一般情況約等於可用CPU數量)
分代收集算法
目前的垃圾回收都采用分代收集算法.也就衍生了很多垃圾收集器 “分代收集”(Generational Collection)算法,把Java堆分為新生代和老年代,這樣就可以根據各個年代的特點采用最適當的收集算法。 在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用復制算法,只需要付出少量存活對象的復制成本就可以完成收集。 而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記-清理”或“標記-整理”算法來進行回收。 一般都會選擇“標記-整理”.因為“標記-清理”會產生許多不連續的空間.到時會有很多碎片Serial收集器
串行收集器是最古老,最穩定以及效率高的收集器,可能會產生較長的停頓,只使用一個線程去回收。
新生代、老年代使用串行回收;新生代復制算法、老年代標記-壓縮;垃圾收集的過程中會Stop The World(服務暫停)
參數控制:-XX:+UseSerialGC 串行收集器
ParNew收集器
ParNew收集器其實就是Serial收集器的多線程版本。新生代並行,老年代串行;新生代復制算法、老年代標記-壓縮 參數控制: -XX:+UseParNewGC ParNew收集器 -XX:ParallelGCThreads 限制線程數量Parallel收集器
Parallel Scavenge收集器類似ParNew收集器,Parallel收集器更關註系統的吞吐量。可以通過參數來打開自適應調節策略,虛擬機會根據當前系統的運行情況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間或最大的吞吐量;
也可以通過參數控制GC的時間不大於多少毫秒或者比例;
新生代復制算法、老年代標記-壓縮
參數控制:-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
Parallel Old 收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。這個收集器是在JDK 1.6中才開始提供 參數控制: -XX:+UseParallelOldGC 使用Parallel收集器+ 老年代並行CMS收集器
JVM GC算法 垃圾回收器