1. 程式人生 > >JVM之幾種垃圾收集器簡單介紹

JVM之幾種垃圾收集器簡單介紹

new root 哪些 組合 sca jpg 跨年 tails ive

本文中的垃圾收集器研究背景為:HotSpot+JDK1.7 一、垃圾收集器概述 技術分享圖片 如上圖所示,垃圾回收算法一共有7個,3個屬於年輕代、三個屬於年老代,G1屬於橫跨年輕代和年老代的算法。 JVM會從年輕代和年老代各選出一個算法進行組合,連線表示哪些算法可以組合使用 二、各個垃圾收集器說明 1、Serial(年輕代)
  1. 年輕代收集器,可以和Serial Old、CMS組合使用
  2. 采用復制算法
  3. 使用單線程進行垃圾回收,回收時會導致Stop The World,用戶進程停止
  4. client模式年輕代默認算法
  5. GC日誌關鍵字:DefNew(Default New Generation)
  6. 圖示(Serial+Serial Old)
    技術分享圖片
2、ParNew(年輕代)
  1. 新生代收集器,可以和Serial Old、CMS組合使用
  2. 采用復制算法
  3. 使用多線程進行垃圾回收,回收時會導致Stop The World,其它策略和Serial一樣
  4. server模式年輕代默認算法
  5. 使用-XX:ParallelGCthreads參數來限制垃圾回收的線程數
  6. GC日誌關鍵字:ParNew(Parallel New Generation)
  7. 圖示(ParNew + Serail Old)
技術分享圖片 3、Paralle Scavenge(年輕代)
  1. 新生代收集器,可以和Serial Old、Parallel組合使用,不能和CMS組合使用
  2. 采用復制算法
  3. 使用多線程進行垃圾回收,回收時會導致Stop The World
  4. 關註系統吞吐量
    1. -XX:MaxGCPauseMillis:設置大於0的毫秒數,收集器盡可能在該時間內完成垃圾回收
    2. -XX:GCTimeRatio:大於0小於100的整數,即垃圾回收時間占總時間的比率,設置越小則希望垃圾回收所占時間越小,CPU能花更多的時間進行系統操作,提高吞吐量
    3. -XX:UseAdaptiveSizePolicy:參數開關,啟動後系統動態自適應調節各參數,如-Xmn、-XX:SurvivorRatio等參數,這是和ParNew收集器重要的區別
  5. GC日誌關鍵字:PSYoungGen
4、Serial Old(年老代)
  1. 年老代收集器,可以和所有的年輕代收集器組合使用(Serial收集器的年老代版本)
  2. 采用 ”標記-整理“算法,會對垃圾回收導致的內存碎片進行整理
  3. 使用單線程進行垃圾回收,回收時會導致Stop The World,用戶進程停止
  4. GC日誌關鍵字:Tenured
  5. 圖示(Serial+Serial Old)
    技術分享圖片
5、Parallel Old(年老代)
  1. 年老代收集器,只能和Parallel Scavenge組合使用(Parallel Scavenge收集器的年老代版本)
  2. 采用 ”標記-整理“算法,會對垃圾回收導致的內存碎片進行整理
  3. 關註吞吐量的系統可以將Parallel Scavenge+Parallel Old組合使用
  4. GC日誌關鍵字:ParOldGen
  5. 圖示(Parallel Scavenge+Parallel Old)
    技術分享圖片
6、CMS(Concurrent Mark Sweep年老代)
  1. 年老代收集器,可以和Serial、ParNew組合使用
  2. 采用 ”標記-清除“算法,可以通過設置參數在垃圾回收時進行內存碎片的整理
    1、UserCMSCompactAtFullCollection:默認開啟,FullGC時進行內存碎片整理,整理時用戶進程需停止,即發生Stop The World
    2、CMSFullGCsBeforeCompaction:設置執行多少次不壓縮的Full GC後,執行一個帶壓縮的(默認為0,表示每次進入Full GC時都進行碎片整理)
  3. CMS是並發算法,表示垃圾回收和用戶進行同時進行,但是不是所有階段都同時進行,在初始標記、重新標記階段還是需要Stop the World。CMS垃圾回收分這四個階段
    1、初始標記(CMS Initial mark) Stop the World 僅僅標記一下GC Roots能直接關聯到的對象,速度快
    2、並發標記(CMS concurrent mark) 進行GC Roots Tracing,時間長,不發生用戶進程停頓
    3、重新標記(CMS remark) Stop the World 修正並發標記期間因用戶程序繼續運行導致標記變動的那一部分對象的標記記錄,停頓時間較長,但遠比並發標記時間短
    4、並發清除(CMS concurrent sweep) 清除的同時用戶進程會導致新的垃圾,時間長,不發生用戶進程停頓
  4. 適合於對響應時間要求高的系統
  5. GC日誌關鍵字:CMS-initial-mark、CMS-concurrent-mark-start、CMS-concurrent-mark、CMS-concurrent-preclean-start、CMS-concurrent-preclean、CMS-concurrent-sweep、CMS-concurrent-reset等等
  6. 缺點
    1、對CPU資源非常敏感
    2、CMS收集器無法處理浮動垃圾,即清除時用戶進程同時產生的垃圾,只能等到下次GC時回收
    3、因為是使用“標記-清除”算法,所以會產生大量碎片
  7. 圖示
技術分享圖片 7、G1
  1. G1收集器由於沒有使用過,所以從網上找了一些教程供大家了解
    1. 並行與並發
    2. 分代收集
    3. 空間整合
    4. 可預測的停頓
  2. http://blog.csdn.net/renfufei/article/details/41897113
  3. http://blog.csdn.net/woshiqjs/article/details/7290513
三、各垃圾收集參數設置 技術分享圖片

技術分享圖片

JVM之幾種垃圾收集器簡單介紹