1. 程式人生 > >krycai

krycai

1、序列回收器

指使用單執行緒進行垃圾回收的回收器。每次回收時,序列回收器只有一個工作執行緒,對於並行能力較弱的計算機來說,序列回收器的專注性和獨立性往往有更好的效能表現。序列回收器可以在新生代和老年代使用,根據作用於不同的堆空間,分為新生代序列回收器和老年代序列回收器。

1.1 新生代序列回收器

特點:

(1)、使用單執行緒進行垃圾回收;

(2)、是獨佔式的垃圾回收;

(3)、是一個成熟且經過長時間生產環境考驗的極為高效的收集器;

(4)、新生代序列處理器使用複製演算法;

(5)、實現相對簡單、邏輯處理特別高效、且沒有執行緒切換的開銷。

1.2 老年代序列回收器

特點:

(1)、使用標記壓縮演算法;

(2)、序列、獨佔式的垃圾回收器;

(3)、停頓較長的時間

用途:

可以和多種新生代回收器配合使用,同時它也可以作為CMS回收器的備用回收器。

若啟動老年代序列回收器,可以嘗試使用以下引數:

-XX:+UseSerialGC :新生代、老年代都使用序列回收器;

-XX:+UseParNewGC:新生代使用ParNew回收器,老年代使用序列收集器;

-XX:+UseParallelGC:新生代使用ParallelGC回收器。老年代使用序列收集器。

2、並行回收器

在序列回收器的基礎上做了改進,它使用多個執行緒同時進行垃圾回收。對於並行能力強的計算機,可以有效縮短垃圾回收所需的實際時間。

2.1 新生代ParNew回收器

特點:

(1) 是一個工作在新生代的垃圾收集器。

(2)、將序列回收器多執行緒化,它的回收策略、演算法以及引數和新生代序列回收器一樣。

(3)、獨佔式回收器

下圖為ParNew回收器工作示意圖:

開啟ParNew回收器可以使用一下引數:

-XX:+UseParNewGC: 新生代使用ParNew回收器,老年代使用序列回收器;

-XX:+UseConcMarkSweepGC:新生代使用ParNew回收器,老年代使用CMS;

-XX:ParallelGCThreads :指定ParNew回收器工作時的執行緒數量。

2.2 新生代ParallelGC回收器

特點:

(1)、使用複製演算法;

(2)、多執行緒、獨佔式的收集器;

(3)、非常關注系統的吞吐量;

(4)、支援一種自適應的GC調節策略;使用-XX:+UseAdaptiveSizePolicy可以開啟自適應GC策略。

使用以下啟用:

-XX:+UseParallelGC:新生代使用ParallelGC回收器。老年代使用序列回收器。

-XX:+UseParallelOldGC:新生代使用ParallelGC回收器。老年代使用UseParallelOldGC回收器。是一對非常關注吞吐量的垃圾回收器組合;

ParallelGC回收器提供了兩個重要的引數用於控制系統的吞吐量:

-XX:MaxGCPauseMillis:設定最大垃圾收集停頓時間;

-XX:GCTimeRatio:設定吞吐量大小。

2.3 老年代ParallelOldGC回收器

特點:

(1)、是一種多執行緒併發的收集器;

(2)、關注吞吐量的收集器;

(3)、使用標記壓縮演算法;

以下是它的工作模式:

3、CMS回收器

特點:

(1)、主要關注於系統停頓時間;

(2)、使用的是標記清除演算法,同時又是一個使用多執行緒並行回收的垃圾回收器。

(3)、不是獨佔式的,可以在應用程式執行過程中進行垃圾回收。

(4)、是多執行緒回收器

主要步驟:

初始標記、併發標記、預清理、重新標記、併發清除和併發重置。

初始標記和重新標記是獨佔系統資源的,而預清理、併發標記、併發清除和併發重置和是可以和使用者執行緒一起執行。

初始標記、併發標記和重新標記都是為了標記出需要回收的物件。

併發清理則是在標記完成後,正式回收垃圾物件。

併發重置是指在垃圾回收完成後,重新初始化CMS資料結構和資料,為下一次垃圾回收做好準備。

以下是工作流程示意圖:

引數:

啟用CMS回收器的引數:-XX:+UseConcMarkSweepGC

預設啟動的併發執行緒數是:(ParallelGCThreads+3)/4 ,ParallelGCThreads表示GC病情時使用的執行緒數量;

回收閾值可以使用-XX:CMSInitiatingOccupancyFrantion 來指定,預設是68

-XX:+UseCMSCompactAtFullCollection 使CMS在垃圾收集完成後,進行一次記憶體碎片整理,記憶體碎片的整理不是併發進行的。

-XX:CMSFullGCsBeforeCompaction 用於設定進行多少次CMS回收後,進行一次記憶體壓縮。

注意:

併發是指收集器和應用執行緒交替執行,並行是指應用程式停止,同時由多個執行緒一起執行GC,因此並行回收器不是併發的,因為並行回收器執行時,應用程式完成掛起,不存在交替執行的步驟。

4 G1回收器

從分代上看,G1依然屬於分代垃圾回收器,它會區分年輕代和老年代,依然有eden區和survivor區;從堆的結構看,它並不要求整個eden區、年輕代或者老年代都連續。

特點:

(1)、並行性:G1在回收期間,可以由多個GC執行緒同時工作,有效利用多核計算能力;

(2)、併發性:G1擁有與應用程式交替執行的能力,部分工作可以和應用程式同時執行,因此一般來說,不會在整個回收期間完全阻塞應用程式;

(3)、分代GC:G1依然是一個分代收集器,但是和之前回收器不同,它同時兼顧年輕代和老年代。對比其他回收器,他們或者工作在年輕代,或者工作在老年代。因此,這裡是一個很大的 不同。

(4)、空間整理:G1在回收過程中,會進行適當的物件移動,不像CMS,只是簡單地標記清理物件,在若干次GC後,CMS必須進行一次碎片整理。而G1不同,它每次回收都會有效地複製物件,減少空間碎片。

(5)、由於分割槽的原因,G1可以只選取部分割槽域進行記憶體回收,這樣縮小了回收的範圍,因此對於全域性停頓也能得到較好的控制。

過程:新生代GC 、併發標記週期、混合收集、如果需要,可能會進行Full GC

G1的新生代GC

主要工作是回收eden區和survivor區。一旦eden區被佔滿,新生代GC就會啟動。E 表示eden區,O表示老年代,S表示survivor區。

併發標記週期:

初始標記:標記從根節點直接可達的物件。這個階段會伴隨一次新生代GC,它是會產生全域性停頓的,應用程式執行緒在這個階段必須停止執行。

根區域掃描:由於初始標記必須會伴隨一次新生代GC,所以在初始化標記後,eden被清空,並且存活物件被入survivor區,在這個階段,將掃描由survivor區直接可達的老年代區域,並標記這些直接可達的物件。這個過程是可以和應用程式併發執行的。但是根區域掃描不能和新生代GC同時執行,因此如果恰好在此時需要進行新生代GC,GC就需要等待根區域掃描結束後才能進行,如果發生這種情況,這次新生代GC的時間就會延長。

併發標記:和CMS類似,併發標記將會掃描並查詢整個堆的存活物件,並做好標記。這是一個併發的過程,並且這個過程可以被一次新生代GC打斷。

重新標記:和CMS一樣,重新標記也是會產生應用程式停頓的。由於在併發標記過程中,應用程式依然在執行,因此標記結果可能需要進行修正,所以在此對一次的標記結果進行補充,在GC1中,這個過程使用SATB演算法完成,即G1會再標記之初為存活物件一個快照,這個快照有助於加速重新標記的速度。

獨佔清理:這個階段是會引起停頓的。它將計算各個區域的存活物件和GC回收比例並進行排序,識別可供混合回收的區域,在這個階段,還會更新記憶集。該階段給出了需要被混合回收的區域並進行了標記,在混合回收階段,還需要這些資訊。

併發清理階段:這裡會識別並清理完全空閒的區域。它是併發的清理,不會引起停頓。

併發週期的主要工作流程:

Full GC: 和CMS類似,併發收集由於讓應用程式和GC執行緒交替工作,因此總是不能完全避免在特別繁忙的場合會出現在回收過程中記憶體不充足的情況。當遇到這種情況時,G1也會轉入一個Full GC進行回收。

G1相關的引數:

-XX:+UseG1GC :標記開啟G1收集器開關;

-XX:MaxGCPauseMillis 用於指定目標最大停頓時間;

-XX:ParallelGCThreads 用於設定並行回收時,GC的工作執行緒數量;

-XX:InitiatingHeapOccupancyPercent 指定當整個堆使用率達到多少時,觸發併發標記週期的執行。預設值是45

以上內容來源於 <<實戰Java虛擬機器_JVM故障診斷與效能優化>> 的學習筆記,喜歡的點贊,謝謝。