CMS 收集器1. 概述CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。由于大部分 Java 應(yīng)用主要集中在互聯(lián)網(wǎng)網(wǎng)站以及基于瀏覽器的 B/S 系統(tǒng)的服務(wù)端,這類應(yīng)用通常會(huì)較為關(guān)注服務(wù)的響應(yīng)速度,希望系統(tǒng)的停頓時(shí)間盡可能少,CMS 收集器就非常符合這類應(yīng)用的需求 2. 步驟從名字可以知道,CMS 收集器是基于標(biāo)記 - 清除算法實(shí)現(xiàn)的,它的運(yùn)作過(guò)程分為四個(gè)步驟:
由于整個(gè)過(guò)程中耗時(shí)最長(zhǎng)的是并發(fā)標(biāo)記和并發(fā)清除階段,而這兩個(gè)階段都可以和用戶線程并發(fā)執(zhí)行,所以從總體上看,CMS 收集器內(nèi)存回收過(guò)程是與用戶線程一起并發(fā)執(zhí)行的 3. CMS 收集器的不足CMS 收集器的主要優(yōu)點(diǎn)就是:并發(fā)收集、低停頓,因此也稱 CMS 收集器為并發(fā)低停頓收集器。但 CMS 還遠(yuǎn)未達(dá)到完美的程度,它至少有以下四個(gè)明顯的缺點(diǎn):
Garbage First 收集器1. 概述Garbage First(G1)收集器是一款主要面向服務(wù)端應(yīng)用的垃圾收集器,開(kāi)創(chuàng)了收集器面向局部收集的設(shè)計(jì)思路和基于 Region 的內(nèi)存布局形式。HotSpot 開(kāi)發(fā)團(tuán)隊(duì)對(duì) G1 收集器的期望就是能在將來(lái)替代 CMS 收集器,所以在 JDK9 發(fā)布之日,G1 便宣告取代 Parallel Scavenge 加 Parallel Old 組合,成為服務(wù)端模式下的默認(rèn)垃圾收集器,而 CMS 則淪為不推薦使用 2. 分區(qū)概念在過(guò)去,包括 CMS 在內(nèi),垃圾收集的范圍要么是整個(gè)新生代,要么是整個(gè)老年代,再要么是整個(gè) Java 堆。而 G1 可以面向堆內(nèi)存任何部分來(lái)組成回收集(Collection Set,一般簡(jiǎn)稱 CSet)進(jìn)行回收,衡量標(biāo)準(zhǔn)是哪塊內(nèi)存中垃圾數(shù)量最多,回收收益最大,這就是 G1 收集器的 Mixed GC 模式 雖然 G1 也是基于分代收集理論設(shè)計(jì),但其對(duì)內(nèi)存布局與其他收集器有明顯差異。G1 把連續(xù)的 Java 堆劃分成多個(gè)大小相等的獨(dú)立區(qū)域(Region),每一個(gè) Region 可以根據(jù)需要扮演新生代的 Eden 空間、Survivor 空間、老年代空間等等。收集器能對(duì)扮演不同角色的 Region 采用不同的策略處理 Region 中還有一類特殊的 Humongous 區(qū)域,專門用來(lái)存儲(chǔ)大對(duì)象。只要該對(duì)象大小超過(guò)一半的 Region 的容量即可判定為大對(duì)象。而對(duì)于那些超過(guò)整個(gè) Region 容量的超級(jí)大對(duì)象,將會(huì)被存放在 N 個(gè)連續(xù)的 Humongous Region 之中,G1 的大多數(shù)行為都把 Humongous Region 作為老年代的一部分來(lái)看待 3. 停頓時(shí)間模型停頓時(shí)間模型的意思是能夠支持指定在一個(gè)長(zhǎng)度為 M 毫秒的時(shí)間片段內(nèi),消耗在垃圾收集上的時(shí)間大概率不超過(guò) M 毫秒這么一個(gè)目標(biāo)。G1 收集器作為 CMS 收集器的替代者,自然可以實(shí)現(xiàn)這個(gè)目標(biāo) G1 之所以能建立起可預(yù)測(cè)的停頓時(shí)間模型,是因?yàn)樗鼘?Region 作為單詞回收的最小單元,即每次收集到的內(nèi)存空間都是 Region 大小的整數(shù)倍,這樣可以有計(jì)劃地避免進(jìn)行全區(qū)域的垃圾收集。G1 收集器還可以跟蹤每個(gè) Region 的垃圾堆積的“價(jià)值”大小,即回收所獲得的空間大小以及所需時(shí)間,并在后臺(tái)維護(hù)一個(gè)優(yōu)先級(jí)列表,每次根據(jù)用戶設(shè)置的允許收集停頓時(shí)間(使用 -XX:MaxGCPauseMillis 指定),優(yōu)先處理回收價(jià)值最大的 Region。這種使用 Region 劃分內(nèi)存空間,以及具有優(yōu)先級(jí)的區(qū)域回收方式,保證了 G1 收集器在有限的時(shí)間內(nèi)獲取盡可能高的收集效率 4. 要解決的難點(diǎn)G1 收集器的設(shè)計(jì)理念看似無(wú)太多驚人之處,其實(shí)有很多關(guān)鍵的細(xì)節(jié)問(wèn)題需要解決:
5. 步驟G1 收集器的運(yùn)作過(guò)程大致可劃分為以下四個(gè)步驟:
6. G1 和 CMS 的對(duì)比G1 和 CMS 都非常關(guān)注停頓時(shí)間控制,毫無(wú)疑問(wèn),可以由用戶指定期望的停頓時(shí)間是 G1 收集器的一大殺手锏。G1 收集器經(jīng)常被拿來(lái)和 CMS 收集器比較,從長(zhǎng)遠(yuǎn)來(lái)看,G1 收集器肯定是會(huì)取代 CMS 收集器的 除了更先進(jìn)的設(shè)計(jì)理念,單從傳統(tǒng)的算法理論來(lái)看,G1 從整體來(lái)看是基于標(biāo)記 - 整理算法實(shí)現(xiàn),而從局部來(lái)看(兩個(gè) Region 之間)又是基于標(biāo)記 - 復(fù)制算法實(shí)現(xiàn),這意味著 G1 不會(huì)產(chǎn)生內(nèi)存碎片。但 G1 并非全方面碾壓 CMS,G1 由于其復(fù)雜的內(nèi)部細(xì)節(jié)實(shí)現(xiàn),使得垃圾收集時(shí)的內(nèi)存占用和程序運(yùn)行時(shí)的額外執(zhí)行負(fù)載都要比 CMS 高。使用哪款收集器,往往要針對(duì)具體場(chǎng)景才能做定量比較,目前在小內(nèi)存應(yīng)用上 CMS 的表現(xiàn)大概率會(huì)優(yōu)于 G1,而在大內(nèi)存應(yīng)用上 G1 則占有優(yōu)勢(shì),這個(gè)平衡點(diǎn)通常在 6GB ~ 8GB 之間。當(dāng)然,隨著 HotSpot 開(kāi)發(fā)者對(duì) G1 的持續(xù)優(yōu)化,最終勝利的天平必定回向 G1 傾斜 |
|