天天看點

JVM垃圾回收器總結

垃圾收集器(7種)(記憶體回收動作的執行)

1) Serial收集器:一個單線程收集器,用于新生代;進行垃圾收集時,必須暫停其他所有工作線程,直到它收集結束。(Client模式下經常使用)

2) ParNew收集器:是Serial收集器的多線程版本,可以使用多條線程進行垃圾收集。(Server模式下經常使用,用于新生代)

3) Parallel Scavenge收集器:是一個新生代收集器,也是使用複制算法,同時是多線程收集器。關注點在提升吞吐量(其他收集器更關注GC停頓時間),适用于在背景運算而不需要太多互動的任務。自适應調節政策也是Parallel Scavenge收集器與ParNew收集器的一個重要差別。

4) Serial Old收集器:是Serial收集器的老年代版本,老年代采用标記-整理算法。

5) Parallel Old收集器:是Parallel收集器的老年代版本。在注重吞吐量以及CPU資源敏感的場合,都可以優先考慮Parallel Scavenge加上Parallel Old收集器。

6) CMS收集器(重點):是一種以擷取最短回收停頓時間為目标的收集器。老年代收集器,基于“标記-清除”算法實作。

過程:1)初始标記:标記一下GC roots能直接關聯到的對象(需要GC停頓)

           2) 并發标記:進行GC roots追蹤的過程,即發現非直接關聯的對象。

           3)重新标記:修正在并發标記期間因使用者程式繼續運作而導緻标記産生變動的 那一部分對象的标記記錄(需要GC停頓)

           4)并發清除

缺點:1)對CPU資源非常敏感。即比較占用CPU資源,導緻應用程式變慢。

           2)無法處理浮動垃圾。在本次垃圾清理過程的時間段内其他線程運作産生的垃圾未被标記,隻能等到下一次垃圾清理時再清理,這些垃圾稱為浮動垃圾。

           3)基于“标記-清除算法”,會産生大量空間碎片。

7) G1收集器(重點):面向服務端應用的垃圾收集器。

特點:1)并行與并發:能充分利用多CPU,多核環境下的硬體優勢,通過并發的方式讓Java程式繼續執行,降低停頓。

           2)分代收集:能夠采用不同的方式去處理新建立的對象和已經存活了一段時間,熬過多次GC的舊對象。

           3)空間整合:基于“标記-整理”算法實作的收集器,不會産生記憶體碎片。

           4)可預測的停頓:除了低停頓外,還支援建立可預測的停頓時間模型,能讓使用者明确指定在一個長度為M毫秒的時間片段内,消耗在垃圾收集上的時間不得超過N毫秒。

使用G1收集器是,Java對記憶體布局就和其他收集器有很大差别。它将整個Java堆劃分為多個大小相等的獨立區域,新生代和老年代不在是實體隔離了,它們都是一部分Region的集合。

G1收集器實作可預測停頓時間模型,是因為他可以獲得所有Region裡面的垃圾量,在優先隊列中優先回收價值最大的Region區域。

因為一個Region内的對象有可能引用其他Region内的對象,如果回收一個Region内的對象需要掃描所有Region來确定它是否可以被回收,效率太低。G1在每一個Region中設定一個Remembered Set記錄被其他的那個Region引用,這樣就不需要全堆掃描了。

過程:1)初始标記:标記與GC Roots直接連接配接的對象

          2)并發标記:是從GC Root開始對堆中的對象進行科學大興分析,找出存活的對象,這階段好事較長,但可與使用者程式并行執行。

          3)最終标記:為了修正在并發标記期間因使用者程式繼續運作二而導緻标記産生變動的那一部分标記記錄。

          4)篩選回收:對各個Region的回收價值和成本進行排序,可以根據使用者期望的GC停頓時間來指定回收計劃。