當前主流的VM垃圾收集都採用「分代收集「算法,這種算法會根據對象存活週期的不一樣將內存劃分爲幾塊, 如JVM中的新生代、老年代、永久代,這樣就能夠根據個年代特色分別採用最適當的GC算法。java
每次垃圾收集都能發現大批對象已死,只有少許存活。所以選用複製算法,只須要付出少許存活對象的複製成本就能夠完成收集。算法
由於對象存活率高、沒有額外空間對它進行分配擔保,就必須採用「標記-清理」或者」標記-整理「算法來進行回收,沒必要進行內存複製,且直接騰出空閒內存。多線程
分區算法則將整個堆空間劃分爲連續的不一樣小區間,每一個小區間獨立使用,獨立回收。這樣作的好處是能夠控制一次回收多個小區間,根據目標停頓時間,每次合理的回收若干個小區間(而不是整個堆),從而減小一次GC所產生的的停頓。併發
Java堆內存被劃分爲新生代和年老代兩部分,新生代主要使用複製和標記-清除算法,年老代主要使用標記整理垃圾回收算法,所以JVM中針對新生代和年老代分別提供了多種不一樣的垃圾回收器。線程
是最基本的垃圾回收器,使用複製算法,曾經是JDK1.3.1以前新生代惟一的垃圾回收器。 Serial 是一個單線程的收集器,它不但只會使用一個 CPU 或一條線程去完成垃圾收集工做, 而且在進行垃圾收集的同時,必須暫停其餘全部的工做線程,直到垃圾收集結束。 Serial 垃圾收集器雖然在收集垃圾過程當中須要暫停全部其餘的工做線程,可是它簡單高效,對於限定單個 CPU 環境來講,沒有線程交互的開銷,能夠得到最高的單線程垃圾收集效率, 所以 Serial垃圾收集器依然是 java 虛擬機運行在 Client 模式下默認的新生代垃圾收集器。對象
ParNew實際上是Serial的多線程版本,也是使用複製算法,除了使用多線程進行垃圾收集以外,其他的行爲與ParNew徹底同樣。 ParNew 垃圾收集器在垃圾收集過程當中一樣也要暫停全部其餘的工做線程。 ParNew 收集器默認開啓和 CPU 數目相同的線程數,能夠經過-XX:ParallelGCThreads 參數來限 制垃圾收集器的線程數。【Parallel:平行的】ParNew雖然是除了多線程外和Serial收集器幾乎徹底同樣, 可是ParNew垃圾收集器是不少java虛擬機運行在 Server 模式下新生代的默認垃圾收集器。內存
Parallel Scavenge 收集器也是一個新生代垃圾收集器,一樣使用複製算法,也是一個多線程的垃圾收集器, 它重點關注的是程序達到一個可控制的吞吐量(Thoughput,CPU 用於運行用戶代碼的時間/CPU 總消耗時間,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)), 高吞吐量能夠最高效率地利用 CPU 時間,儘快地完成程序的運算任務,主要適用於在後臺運算而不須要太多交互的任務。 **自適應調節策略也是 ParallelScavenge 收集器與 ParNew 收集器的一個重要區別。 **虛擬機
Serial Old 是 Serial 垃圾收集器年老代版本,它一樣是個單線程的收集器,使用標記-整理算法,這個收集器也主要是運行在 Client 默認的 java 虛擬機默認的年老代垃圾收集器。class
在 Server 模式下,主要有兩個用途:效率
Parallel Old收集器是Parallel Scavenge的年老代版本,使用多線程的標記-整理算法,在JDK1.6纔開始提供。 在 JDK1.6 以前,新生代使用 ParallelScavenge 收集器只能搭配年老代的 Serial Old 收集器,只能保證新生代的吞吐量優先,沒法保證總體的吞吐量,Parallel Old 正是爲了在年老代一樣提供吞吐量優先的垃圾收集器,
**若是系統對吞吐量要求比較高,能夠優先考慮新生代 Parallel Scavenge和年老代 Parallel Old 收集器的搭配策略。 **
Concurrent mark sweep(CMS)收集器是一種年老代垃圾收集器,其最主要目標是獲取最短垃圾回收停頓時間,和其餘年老代使用標記-整理算法不一樣,它使用多線程的標記-清除算法。 最短的垃圾收集停頓時間能夠爲交互比較高的程序提升用戶體驗。CMS 工做機制相比其餘的垃圾收集器來講更復雜,整個過程分爲如下 4 個階段
只是標記一下 GC Roots 能直接關聯的對象,速度很快,仍然須要暫停全部的工做線程。
進行 GC Roots 跟蹤的過程,和用戶線程一塊兒工做,不須要暫停工做線程。
爲了修正在併發標記期間,因用戶程序繼續運行而致使標記產生變更的那一部分對象的標記記錄,仍然須要暫停全部的工做線程。
清除 GC Roots 不可達對象,和用戶線程一塊兒工做,不須要暫停工做線程。因爲耗時最長的併發標記和併發清除過程當中,垃圾收集線程能夠和用戶如今一塊兒併發工做,因此整體上來看CMS 收集器的內存回收和用戶線程是一塊兒併發地執行。
Garbage first 垃圾收集器是目前垃圾收集器理論發展的最前沿成果,相比與 CMS 收集器,G1 收集器兩個最突出的改進是:
G1 收集器避免全區域垃圾收集,它把堆內存劃分爲大小固定的幾個獨立區域,而且跟蹤這些區域的垃圾收集進度,同時在後臺維護一個優先級列表,每次根據所容許的收集時間,優先回收垃圾最多的區域。 區域劃分和優先級區域回收機制,確保 G1 收集器能夠在有限時間得到最高的垃圾收集效率。