標記清除算法
將垃圾回收分爲兩個階段:標記階段
和清除階段
。
標記階段
:首先經過根節點,標記全部從根節點開始的可達對象。未被標記的對象就是未被引用的垃圾對象。
清除階段
:清除全部未被標記的對象。
標記清除算法
可能產生的最大問題是空間碎片
。
注意:標記清除算法先經過根節點標記全部可達對象,而後清除全部不可達對象,完成垃圾回收。算法
eden ===> from to,就是使用的複製算法
優勢:不會產生碎片
缺點:浪費空間多線程
標記壓縮算法是一種老年代的回收算法。併發
新生代能夠用複製算法。
老年代可使用標記-清除算法
或標記-整理算法
。jvm
串行回收器是指使用單線程進行垃圾回收的回收器。性能
串行回收器
主要有兩個特色:線程
單線程
進行垃圾回收獨佔式
的垃圾回收在串行收集器進行垃圾回收時,Java應用程序中的線程都須要暫停,等待垃圾回收的完成。這種現象稱之爲Stop-The-World
。在實時性要求較高的應用場景中,這種現象每每是不能被接受的。code
新生代串行處理器使用複製算法
。對象
使用-XX:+UseSerialGC
參數能夠指定使用新生代串行收集器和老年代串行收集器。內存
老年代串行收集器使用的是標記壓縮算法
。和新生代串行收集器同樣,它也是一個串行的、獨佔式的垃圾回收器。工作流
若是要啓動老年代串行回收器,能夠嘗試使用如下參數:
它只是在串行回收器上作了改進,使用多個線程同時進行垃圾回收。
它是獨佔式
的。
在併發能力比較強的CPU上,它產生的停頓時間要短於串行回收器,而在單CPU或者併發能力較弱的系統中,並行回收器的效果不會比串行回收器好,因爲多線程的壓力,它的實際表現極可能比串並回收器差。
啓動新生代ParNew回收器:
ParNew回收器的線程數量能夠經過-XX:ParallelGCThreads參數指定。
新生代ParallelGC回收器關注系統吞吐量,使用複製算法
。
啓動新生代ParallelGC回收器:
ParallelGC回收器提供了兩個重要的參數用於控制系統的吞吐量:
這是它與ParNew回收器的一個不一樣之處,另一個不一樣之處是它還支持一種自適應的GC調整策略。使用-XX:+UseAdaptiveSizePolicy
能夠打開自適應GC策略。
老年代ParallelOldGC回收器也是一種多線程並行的收集器。它也是一種關注吞吐量的收集器。它使用標記壓縮算法
,它在JDK1.6中才可使用。
使用-XX:+UseParallelOldGC
能夠在新生代使用ParallelGC回收器,老年代使用ParallelOldGC回收器。參數-XX:ParallelGCThreads
也能夠用於設置垃圾回收時的線程數量。
它是非獨佔的。
與ParallelGC
和ParallelOldGC
不一樣,CMS回收器主要關注於系統停頓時間
。CMS是Concurrent Mark Sweep的縮寫,意爲併發標記清除,從名稱上就能夠得知,它使用的是標記清除算法,同時它又是一個使用多線程並行回收的垃圾回收器。
ParNewGC
)注意:
併發
是指收集器和應用線程交替執行。
並行
是指應用程序中止,同時由多個線程一塊兒執行GC。
所以並行回收器不是併發的,由於並行回收器執行時,應用程序徹底掛起,不存在交替執行的步驟。CMS回收器是一個關注停頓的垃圾收集器。同時CMS回收器在部分工做流程中,能夠與用戶程序同時運行,從而下降應用程序的停頓時間。
在使用CMS回收器時,若是須要回收Perm區,那麼默認狀況下,仍是須要觸發一次Full GC的。若是但願使用CMS回收Perm區,則必需要打開-XX:+CMSClassUnloadingEnabled
開關,若是條件容許,那麼系統會使用CMS的機制回收Perm區Class數據。
G1回收器是在JDK1.7中正式使用的全新垃圾回收器,從長期目標來看,它是爲了取代CMS回收器。
從分代上看,G1依然屬於分代垃圾回收器
,它會區分年輕代
和老年代
,依然有eden區和survivor區,但從堆的結構上看,它並不要求整個eden區,年輕代或者老年代都連續。它使用了分區算法
。
做爲CMS的長期替代方案,G1同時使用了全新的分區算法,其特色以下:
G1的手機過程可能有4個階段: