若是說收集算法是內存回收的方法論,那麼垃圾收集器就是內存回收的具體實現。java虛擬機規範中對垃圾收集器應該如何實現沒有任何規定,所以不一樣的廠商、不一樣版本的虛擬機所提供的垃圾收集器均可能會有很大差異,而且通常都會提供參數供用戶根據本身的應用特色和要求組合出各個年代所使用的收集器。這裏以JDK1.7Update14後的HotSpot虛擬機爲例java
上圖,若是兩個收集器之間存在連線,就說明它們能夠搭配使用。算法
1.Serial收集器多線程
Serial收集器是最基本、發展歷史最悠久的收集器,曾經是虛擬機新生代收集的惟一選擇。這是一個單線程的收集器,但它的「單線程」的意義並不只僅說明它只會使用一個CPU或一條手機線程去完成垃圾收集工做,更重要的是在它進行垃圾收集時,必須暫停其餘全部的工做線程,直到它收集結束。「Stop The World」,這項工做其實是由虛擬機在後臺自動發起和自動完成的,在用戶不可見的狀況下吧用戶正常工做的線程所有停掉,這對不少應用來講都是難以接受的。性能
實際到如今爲止,Serial依然是虛擬機運行在Client模式下的默認新生代收集器。它也有着優於其餘收集器的地方:簡單而高效,對於限定單個CPU的環境來講,Serial收集器因爲沒有線程交互的開銷,專心作垃圾收集天然能夠得到最高的單線程收集效率。在用戶的桌面應用場景中,分配給虛擬機管理的內存通常來講不會很大,收集幾十兆甚至一兩百兆的新生代,停頓時間徹底能夠控制在幾十毫秒最多一百多毫秒之內,只要不是頻繁發生,這點停頓是能夠接受的。spa
2.ParNew收集器線程
ParNew收集器其實就是serial收集器的多線程版本,除了使用多條線程進行垃圾收集以外,其他行爲包括serial收集器可用的全部控制參數等都與Serial收集器徹底同樣。blog
多用於Server模式下的虛擬機新生代收集器,其中有一個與性能無關但很重要的緣由是,除了Serial收集器外,目前只有它能與CMS收集器配合工做。內存
ParNew收集器在單CPU的環境中絕對不會有比Serial收集器更好的效果,甚至因爲存在線程交互的開銷,該收集器在經過超線程技術實現的兩個CPU的環境中都不能百分之百的保證能夠超越Serial收集器。它默認開啓的收集線程數與CPU的數量相同。虛擬機
3. Paraller Scavenge收集器io
是一個新生代收集器,使用的是複製算法的收集器,又是並行的多線程收集器。
它的特色是它的關注點與其餘收集器不一樣,CMS等收集器的關注點是儘量地縮短垃圾收集時用戶線程的停頓時間,而paraller Scavenge 收集器的目標則是達到一個可控制的吞吐量。所謂吞吐量就是CPU用於運行用戶代碼的時間與CPU總消耗時間的比值,
停頓時間越短就越適合須要與用戶交互的程序,良好的響應速度能提高用戶體驗,而高吞吐量則能夠高效率的利用CPU時間,儘快完成程序的運算任務,主要適合在後臺運算而不須要太多交互的任務。
Paraller Scavenge收集器提供了兩個參數用於精確控制吞吐量,分別是控制最大垃圾收集停頓時間的 -XX:MaxGCPauseMills參數以及直接設置吞吐量大小的 -XX:GCTimeRatio參數。
MaxGCPauseMills 參數容許的值是一個大於0的毫秒值,收集器將盡量的保證內存回收花費的時間不超過設置值。
GC停頓時間縮短是以犧牲吞吐量和新生代空間換取的:系統吧新生代調小一些,手機300MB新生代確定比手機500MB快,這也致使垃圾收集頻率更頻繁一些,原來10秒收集一次、每次停頓100毫秒,如今變成5秒一次、停頓70毫秒。
此外還有一點:自適應調節策略
4.Serial Old收集器
是Serial收集器的老年代版本,它一樣是一個單線程收集器,使用「標記-整理算法」 主要意義是給Client模式下的虛擬機使用。