垃圾收集算法算法
標記-清除算法:多線程
複製算法:併發
標記-整理算法:性能
分代收集算法:線程
2.垃圾收集器3d
若是兩個垃圾收集器之間存在連線,說明能夠搭配使用。對象
1.Serial收集器blog
特性:簡單而高效,該收集器沒有線程交互的開銷,能夠獲取最高的單線程收集效率。排序
基本原理:單線程,在進行垃圾收集時,必須暫停其餘全部的工做線程,直到它收集結束。內存
使用場景:在Client模式下,分配給虛擬機管理的內存通常來講不會很大,收集幾十兆甚至一兩百兆的新生代,停頓時間徹底能夠接受。
2.ParNew收集器
特性:除了Serial收集器之外,只有ParNew收集器能夠CMS收集器配合。
基本原理:Serial收集器的多線程版本
使用場景:在Server模式下的虛擬機中首選的新生代收集器。
3.Parallel Savenge收集器(吞吐量優先)
特性:縮短停頓時間是以犧牲吞吐量和新生代空間來換取的:新生代空間變小,垃圾回收變得頻繁,致使吞吐量降低。
能夠經過一個開關參數打開 GC 自適應的調節策略(GC Ergonomics),就不須要手工指定新生代的大小(-Xmn)、Eden 和 Survivor 區的比例、晉升老年代對象年齡等細節參數了。虛擬機會根據當前系統的運行狀況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間或者最大的吞吐量。
基本原理:與 ParNew 同樣是多線程收集器,其它收集器目標是儘量縮短垃圾收集時用戶線程的停頓時間,而它的目標是達到一個可控制的吞吐量,所以它被稱爲「吞吐量優先」收集器。
使用場景:停頓時間越短就越適合須要與用戶交互的程序,良好的響應速度能提高用戶體驗。而高吞吐量則能夠高效率地利用 CPU 時間,儘快完成程序的運算任務,適合在後臺運算而不須要太多交互的任務。
4.Serial Old 收集器
基本原理:Serial Old是Serial收集器的老年代版本,單線程收集器,使用「標記-整理」算法
使用場景:主要意義也是在於給Client模式下的虛擬機使用。若是在Server模式下,那麼它主要還有兩大用途:一種用途是在JDK 1.5以及以前的版本中與Parallel Scavenge收集器搭配使用,另外一種用途就是做爲CMS收集器的後備預案,在併發收集發生用。
5.Parallel Old收集器
特性:除了Serial收集器之外,只有ParNew收集器能夠CMS收集器配合。
基本原理:Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和「標記-整理」算法。
使用場景:在注重吞吐量以及CPU資源敏感的場合,均可以優先考慮Parallel Scavenge加Parallel Old收集器。
6.CMS收集器
因爲整個過程當中耗時最長的併發標記和併發清除過程收集器線程均可以與用戶線程一塊兒工做,因此,從整體上來講,CMS收集器的內存回收過程是與用戶線程一塊兒併發執行的。
有如下3個明顯的缺點:
7.G1收集器
G1(Garbage-First),它是一款面向服務端應用的垃圾收集器,在多 CPU 和大內存的場景下有很好的性能。HotSpot 開發團隊賦予它的使命是將來能夠替換掉 CMS 收集器。
堆被分爲新生代和老年代,其它收集器進行收集的範圍都是整個新生代或者老年代,而 G1 能夠直接對新生代和老年代一塊兒回收。
G1 把堆劃分紅多個大小相等的獨立區域(Region),新生代和老年代再也不物理隔離。
經過引入 Region 的概念,從而將原來的一整塊內存空間劃分紅多個的小空間,使得每一個小空間能夠單獨進行垃圾回收。這種劃分方法帶來了很大的靈活性,使得可預測的停頓時間模型成爲可能。經過記錄每一個 Region 垃圾回收時間以及回收所得到的空間(這兩個值是經過過去回收的經驗得到),並維護一個優先列表,每次根據容許的收集時間,優先回收價值最大的 Region。
每一個 Region 都有一個 Remembered Set,用來記錄該 Region 對象的引用對象所在的 Region。經過使用 Remembered Set,在作可達性分析的時候就能夠避免全堆掃描。
若是不計算維護 Remembered Set 的操做,G1 收集器的運做大體可劃分爲如下幾個步驟:
具有以下特色: