JVM學習-垃圾收集器

虛擬機有許多的垃圾收集器可以選擇,這裏簡單的記錄分享下每個收集器的特點

一、Serial
  1. 歷史最久,曾經是新生代唯一選擇
  2. 單線程,進行時暫停所有用戶線程-Stop The World
  3. Client模式下默認新生代收集器
  4. 單個線程更加高效簡單,沒有線程交互開銷,一般client應用內存使用不大,停頓時間很短

二、ParNew

  1. Serial的多線程版本,控制參數、收集算法、Stop The World、對象分配策略、回收策略相同
  2. 新生代收集器
  3. 除了Serial已外,只有ParNew可以與CMS配合使用
  4. 單CPU環境下,性能差於Serial
  5. 默認下GC線程數與CPU數相同,可配置(-XX: ParallelGCThreads)

三、Parallel Scavenge

  1. 新生代收集器,採用複製算法
  2. 並行多線程收集
  3. 目標不是縮短停頓時間,而是達到可控制的吞吐量:CPU運行用戶線程時間與CPU總消耗時間比
  4. 爲了更高效率利用CPU時間
  5. 兩個參數控制吞吐量:最大停頓時間:-XX:MaxGCPauseMillis(>0),直接吞吐量大小:-XX:GCTimeRatio(0~100)
  6. 儘可能保證停頓時間不超過設置值,
  7. 短停頓時間以犧牲吞吐量和新生代空閒換取,GC更頻繁,吞吐量下降
  8. GCTimeRatio 吞吐量倒數,默認值99,即最大1% GC時間
  9. 吞吐量優先
  10. 自動化開關參數:-XX:+UseAdaptiveSizePolicy,不需手動設置新生代大小(-Xmn)、Eden與Survivor區比例(-XX:SurvivorRatio)、晉升老年代年齡(-XX:PretenureSizeThreadhold),虛擬機GC自適應調節策略:動態調整這些參數提供最適合的停頓時間或最大吞吐量
  11. 同是多線程並行,自適應調節是與ParNew最大的區別

四、Serial Old

  1. Serial的老年代版本
  2. 單線程
  3. 標記-整理 算法
  4. 主要用於Client模式

五、Parallel Old

  1. Parallel Scavenge 老年代版本
  2. 並行多線程
  3. 標記-整理 算法
  4. 在此收集器發佈前,Parallel Scavenge 只能與Serial Old配置使用,二Serial Old在服務端應用性能較差
  5. 與Parallel Scavenge 配合,吞吐量優先

六、CMS

  1. Concurrent Mark Sweep,併發低停頓
  2. 以最短停頓時間爲目標
  3. 標記-清除 算法
  4. 收集四個階段:初始標記、併發標記、重新標記、併發清除
  5. 初始標記:Stop The World,快速標記GC Roots直接關聯對象
  6. 併發標記:併發可達性分析
  7. 重新標記,Stop The World,修正併發階段對象引用變動導致的變更
  8. 最耗時的併發標記、併發清除可以與用戶線程一起工作
  9. 對CPU資源敏感,多線程併發程序通常都是這樣,當CPU數少,或CPU資源緊張,性能下降
  10. 無法處理浮動垃圾,可能出現Concurrent Mode Failure 導致另一次Full GC;
  11. 浮動垃圾(Floating Garbage):併發清理階段用戶線程還在運行,這個階段新產生的垃圾不會在該次GC回收,因爲已經過了標記階段;
  12. 不可在老年代幾乎用完才啓動GC,必須保留較大一部分空間,用於GC中程序繼續運行所需,默認68%
  13. 通過-XX:CMSInitiatingOccupancyFraction控制這個百分比,設置過高會導致“Concurrent Mode Failure”,過低又導致頻繁GC
  14. CMS GC期間,出現內存不出會出現“Concurrent Mode Failure”失敗,虛擬機將會啓動後背方案,保證內存分配:臨時啓動Serial Old 重新一次老年代GC,導致長停頓
  15. 標記-清除 算法導致內存碎片,大對象分配難,導致頻繁GC,運行控制Full GC 時開啓合併整理,但是會導致停頓時間加長

七、G1(Garbage-First)

  1. JDK1.7 最新,面向服務端應用
  2. 併發、並行:充分利用多CPU
  3. 分代收集,可管理整個堆,包括新生代和老年代
  4. 標記-整理 、複製 算法,GC不產生碎片
  5. 低停頓,可預測停頓時間模式
  6. 內存分區域管理(保留新生代和老年代概念)
  7. 分區域進行GC,避免全區域GC,高回收價值區域(單位時間內回收更多的內存空間)優先回收,可控制停頓時間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章