前言
今天就來介紹一下GC垃圾收集器惠遏。
GC 垃圾收集器
Java 堆內(nèi)存被劃分為新生代和年老代兩部分,新生代主要使用復制和標記-清除垃圾回收算法;年老代主要使用標記-整理垃圾回收算法矫户,因此 java 虛擬中針對新生代和年老代分別提供了多種不同的垃圾收集器,JDK1.6 中 Sun HotSpot 虛擬機的垃圾收集器如下:
Serial 垃圾收集器(單線程残邀、復制算法)
Serial(英文連續(xù))是最基本垃圾收集器皆辽,使用復制算法,曾經(jīng)是 JDK1.3.1 之前新生代唯一的垃圾收集器芥挣。Serial 是一個單線程的收集器驱闷,它不但只會使用一個 CPU 或一條線程去完成垃圾收集工作,并且在進行垃圾收集的同時空免,必須暫停其他所有的工作線程空另,直到垃圾收集結(jié)束。
Serial 垃圾收集器雖然在收集垃圾過程中需要暫停所有其他的工作線程蹋砚,但是它簡單高效扼菠,對于限定單個 CPU 環(huán) 境來說,沒有線程交互的開銷坝咐,可以獲得最高的單線程垃圾收集效率循榆,因此 Serial 垃圾收集器依然是 java 虛擬機運行在 Client 模式下默認的新生代垃圾收集器。
ParNew 垃圾收集器(Serial+多線程)
ParNew 垃圾收集器其實是 Serial 收集器的多線程版本畅厢,也使用復制算法冯痢,除了使用多線程進行垃圾收集之外,其余的行為和 Serial 收集器完全一樣框杜,ParNew 垃圾收集器在垃圾收集過程中同樣也要暫停所有其他的工作線程浦楣。ParNew 收集器默認開啟和 CPU 數(shù)目相同的線程數(shù),可以通過-XX:ParallelGCThreads 參數(shù)來限制垃圾收集器 的線程數(shù)咪辱≌窭停【Parallel:平行的】
ParNew 雖然是除了多線程外和 Serial 收集器幾乎完全一樣,但是 ParNew 垃圾收集器是很多 java 虛擬機運行在 Server 模式下新生代的默認垃圾收集器油狂。
Parallel Scavenge 收集器(多線程復制算法历恐、高效)
Parallel Scavenge 收集器也是一個新生代垃圾收集器,同樣使用復制算法专筷,也是一個多線程的垃圾收集器弱贼,它重點關注的是程序達到一個可控制的吞吐量(Thoughput,CPU 用于運行用戶代碼 的時間/CPU 總消耗時間磷蛹,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間))吮旅,高吞吐量可以最高效率地利用 CPU 時間,盡快地完成程序的運算任務味咳,主要適用于在后臺運算而不需要太多交互的任務庇勃。自適應調(diào)節(jié)策略也是 ParallelScavenge 收集器與 ParNew 收集器的一個 重要區(qū)別檬嘀。
Serial Old 收集器(單線程標記整理算法 )
Serial Old 是 Serial 垃圾收集器年老代版本,它同樣是個單線程的收集器责嚷,使用標記-整理算法鸳兽,這個收集器也主要是運行在 Client 默認的 java 虛擬機默認的年老代垃圾收集器。
在 Server 模式下揍异,主要有兩個用途:
- 在 JDK1.5 之前版本中與新生代的 Parallel Scavenge 收集器搭配使用。
- 作為年老代中使用 CMS 收集器的后備垃圾收集方案爆班。
新生代 Serial 與年老代 Serial Old 搭配垃圾收集過程圖:
新生代 Parallel Scavenge 收集器與 ParNew 收集器工作原理類似蒿秦,都是多線程的收集器,都使用的是復制算法蛋济,在垃圾收集過程中都需要暫停所有的工作線程。新生代 Parallel Scavenge/ParNew 與年老代 Serial Old 搭配垃圾收集過程圖:
Parallel Old 收集器(多線程標記整理算法)
Parallel Old 收集器是 Parallel Scavenge 的年老代版本炮叶,使用多線程的標記-整理算法碗旅,在 JDK1.6 才開始提供。在 JDK1.6 之前镜悉,新生代使用 ParallelScavenge 收集器只能搭配年老代的 Serial Old 收集器祟辟,只能保證新生代的吞吐量優(yōu)先,無法保證整體的吞吐量侣肄,Parallel Old 正是為了在年老代同樣提供吞吐量優(yōu)先的垃圾收集器旧困,如果系統(tǒng)對吞吐量要求比較高,可以優(yōu)先考慮新生代 Parallel Scavenge 和年老代 Parallel Old 收集器的搭配策略稼锅。 新生代 Parallel Scavenge 和年老代 Parallel Old 收集器搭配運行過程圖:
CMS 收集器(多線程標記清除算法)
Concurrent mark sweep(CMS)收集器是一種年老代垃圾收集器吼具,其最主要目標是獲取最短垃圾回收停頓時間,和其他年老代使用標記-整理算法不同矩距,它使用多線程的標記-清除算法拗盒。
最短的垃圾收集停頓時間可以為交互比較高的程序提高用戶體驗。
CMS 工作機制相比其他的垃圾收集器來說更復雜锥债,整個過程分為以下 4 個階段:
初始標記
只是標記一下 GC Roots 能直接關聯(lián)的對象陡蝇,速度很快,仍然需要暫停所有的工作線程哮肚。
并發(fā)標記
進行 GC Roots 跟蹤的過程登夫,和用戶線程一起工作,不需要暫停工作線程允趟。
重新標記
為了修正在并發(fā)標記期間恼策,因用戶程序繼續(xù)運行而導致標記產(chǎn)生變動的那一部分對象的標記 記錄,仍然需要暫停所有的工作線程拼窥。
并發(fā)清除
清除 GC Roots 不可達對象戏蔑,和用戶線程一起工作蹋凝,不需要暫停工作線程。由于耗時最長的并發(fā)標記和并發(fā)清除過程中总棵,垃圾收集線程可以和用戶現(xiàn)在一起并發(fā)工作鳍寂,所以總體上來看 CMS 收集器的內(nèi)存回收和用戶線程是一起并發(fā)地執(zhí)行。
CMS 收集器工作過程:
收集器
Garbage first 垃圾收集器是目前垃圾收集器理論發(fā)展的最前沿成果情龄,相比與 CMS 收集器迄汛,G1 收集器兩個最突出的改進是:
- 基于標記-整理算法,不產(chǎn)生內(nèi)存碎片骤视。
- 可以非常精確控制停頓時間鞍爱,在不犧牲吞吐量前提下,實現(xiàn)低停頓垃圾回收专酗。
G1 收集器避免全區(qū)域垃圾收集睹逃,它把堆內(nèi)存劃分為大小固定的幾個獨立區(qū)域,并且跟蹤這些區(qū)域的垃圾收集進度祷肯,同時在后臺維護一個優(yōu)先級列表沉填,每次根據(jù)所允許的收集時間,優(yōu)先回收垃圾最多的區(qū)域佑笋。區(qū)域劃分和優(yōu)先級區(qū)域回收機制翼闹,確保 G1 收集器可以在有限時間獲得最高的垃圾收集效率。
感謝諸君的觀看蒋纬,文中如有紕漏猎荠,歡迎在評論區(qū)來交流。如果這篇文章幫助到了你蜀备,歡迎點贊??關注关摇。