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