日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

深入理解G1

發(fā)布時(shí)間:2023/12/20 95 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解G1 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? G1是JVM歷史上具有里程碑意義的收集器,開創(chuàng)了垃圾收集可控暫停時(shí)間的停頓時(shí)間模型。從G1開始,垃圾收集器不再追求一次將整個(gè)堆清理干凈,而是追求可控的STW時(shí)間,以及在STW時(shí)間內(nèi)盡可能高的內(nèi)存回收速率。早期闡述Java的GC機(jī)制時(shí),經(jīng)常使用媽媽打掃房間的例子,這個(gè)例子說的是你在房間里吃瓜子,然后瓜子皮丟在地上,媽媽在打掃房間的過程中,必須在某個(gè)時(shí)刻限制你暫停吃瓜子(STW)一段時(shí)間,否則房間永遠(yuǎn)沒有打掃完的時(shí)候。我當(dāng)時(shí)看到這個(gè)例子時(shí)想到了兩點(diǎn):1、即使我被暫停吃瓜子一段時(shí)間用來打掃干凈房間,可是之后我還是會(huì)繼續(xù)吃瓜子并將瓜子皮丟在地上,那么這片刻的房間打掃干凈是否有意義;2、媽媽不確定我會(huì)把瓜子皮丟在哪兒,那是不是意味著,房間越大,限制我暫停吃瓜子的時(shí)間就越長(zhǎng)。

? ? ? ? 隨著64位JVM的出現(xiàn),以及對(duì)更大的堆內(nèi)存需求增長(zhǎng),傳統(tǒng)的垃圾收集器的弱點(diǎn)越來越明顯,尤其是隨著大數(shù)據(jù)基礎(chǔ)設(shè)施的發(fā)展,大堆是剛需,即使是最成熟的ParNew+CMS,面對(duì)大數(shù)據(jù)這種對(duì)象生存周期長(zhǎng),突然產(chǎn)生大量對(duì)象的場(chǎng)景也是hold不住,G1的產(chǎn)生為可控的STW、大堆提供了可能。

?

一、G1的特點(diǎn)

? ? ? ? 停頓時(shí)間模型是G1最大的特點(diǎn),停頓時(shí)間模型的意思是在GC過程中支持指定STW時(shí)間大概率不超過M毫秒。為達(dá)到此目標(biāo),G1采用了面向局部收集的設(shè)計(jì)思路和基于Region的內(nèi)存布局。基于Region的堆內(nèi)存布局是達(dá)成這個(gè)目標(biāo)的關(guān)鍵,GC時(shí)將Region作為回收的最小單元,G1收集器跟蹤每個(gè)Region的內(nèi)存使用情況,根據(jù)歷史統(tǒng)計(jì)值估算回收此Region能夠獲得的內(nèi)存空間大小和暫停時(shí)間大小,然后在后臺(tái)維護(hù)Region回收的優(yōu)先級(jí)列表,GC時(shí)根據(jù)用戶設(shè)定的暫停時(shí)間,按照優(yōu)先級(jí)列表中的順序,優(yōu)先回收價(jià)值最大的Region。當(dāng)然,在生產(chǎn)環(huán)境中,最大停頓時(shí)間的設(shè)置不能過于理想化,我們可以認(rèn)為每次垃圾回收釋放的內(nèi)存和最大停頓時(shí)間正相關(guān)。很小的停頓時(shí)間會(huì)導(dǎo)致每次垃圾回收釋放的堆內(nèi)存很小,垃圾收集的速度跟不上分配器分配的速度,導(dǎo)致垃圾堆積,最終占滿整個(gè)堆觸發(fā)Full GC反而降低性能。

?

二、內(nèi)存布局

? ? ? ? G1的內(nèi)存布局是將堆分為多個(gè)大小相等,彼此獨(dú)立的Region,Region的大小根據(jù)啟動(dòng)參數(shù)取值范圍為1MB~32MB,且應(yīng)為2^N,每個(gè)Region都可以作為新生代Eden區(qū),Survivor區(qū),或者老年代空間,Region中海油一類專門放置大對(duì)象的Humongous Region。G1的內(nèi)存布局如圖:

?

三、G1的其他關(guān)鍵概念

? ? ? ? Remembered Set:由于G1的面向局部收集策略,所以在回收垃圾時(shí)出現(xiàn)的跨Region引用對(duì)象問題,為解決此問題引入Remembered Set記錄別的Region指向自己的指針。由于G1的Region數(shù)量比傳統(tǒng)收集器的分代數(shù)量多很多,所以G1收集器要比其他傳統(tǒng)垃圾收集器有更高的內(nèi)存占用負(fù)擔(dān)。

? ? ? ? Card Table:G1引入的數(shù)據(jù)結(jié)構(gòu),是Remembered Set的一種實(shí)現(xiàn),用于記錄非收集區(qū)域是否存在指向收集區(qū)域的指針,類似Hash表。

? ? ? ? Collect Set:在垃圾收集階段,由G1垃圾回收器選擇的待回收的Region集合。

? ? ? ? 寫屏障:指的是改變內(nèi)存值的時(shí)候額外執(zhí)行一些操作。Java使用的分代垃圾回收基本都會(huì)用到寫屏障,主要處理跨代引用的問題,比如將新生代對(duì)象的引用寫入老年代對(duì)象進(jìn)行寫操作時(shí),如果此時(shí)垃圾回收線程也在工作,那么需要仔細(xì)處理老年代對(duì)象對(duì)新生代對(duì)象的引用,避免出現(xiàn)引用沒有被正確及時(shí)的探測(cè)到,進(jìn)而存活對(duì)象被過早回收的問題。

?

四、G1進(jìn)行GC的流程

? ? ? ? G1工作是有兩種模式,分別是Young Gc模式和Mixed GC模式,兩種都是要STW的。Young GC模式和PareNew的非常像,就不詳細(xì)介紹了,主要區(qū)別就是Eden區(qū)和Survivor區(qū)不再是一整塊內(nèi)存,而是由多個(gè)Region邏輯組成。Mixed GC回收時(shí),不區(qū)分是新生代還是老年代,而是按照能從Region中回收的垃圾最多,回收收益大排序,組成回收集,對(duì)回收集中的Region進(jìn)行回收,正常情況下新生代的Eden區(qū)都在回收范圍內(nèi)。如果設(shè)置的暫停時(shí)間過短,可能會(huì)導(dǎo)致Mixed GC回收時(shí)來不及回收Old區(qū)。Mixed GC的工作流程如下:

?

? ? ? ? 整個(gè)過程分為兩個(gè)大的階段:標(biāo)記階段和拷貝存活對(duì)象階段。標(biāo)記階段的主要目標(biāo)是掃描堆內(nèi)存使用情況,估算每個(gè)Region的垃圾回收收益。拷貝存活對(duì)象階段決定回收哪些Region,將Region里的存活對(duì)象復(fù)制到空Region中,再清理掉整個(gè)舊Region的全部?jī)?nèi)存空間。具體過程分為以下四個(gè)步驟:

  • 初始標(biāo)記(Initial Marking):G1的這個(gè)階段與Minor GC同步完成的,此階段標(biāo)記通過GC Roots能直接關(guān)聯(lián)到的對(duì)象(這個(gè)階段需要STW),之后將復(fù)制到新Region的Survivor區(qū)的對(duì)象掃描并標(biāo)記為根;
  • 并發(fā)標(biāo)記(Concurrent Marking):對(duì)全堆的對(duì)象圖進(jìn)行可達(dá)性分析,找出待回收對(duì)象。這個(gè)階段運(yùn)行時(shí)間比較長(zhǎng),但是可以與應(yīng)用程序并發(fā)進(jìn)行,對(duì)象圖掃描完之后,還需要處理并發(fā)標(biāo)記過程中有引用變動(dòng)的對(duì)象;
  • 重新標(biāo)記(Final Marking):仍然需要一個(gè)STW階段,用于處理并發(fā)標(biāo)記階段結(jié)束后仍然有引用變動(dòng)的對(duì)象;
  • 篩選回收(Cleanup):根據(jù)標(biāo)記的可達(dá)對(duì)象,更新Region的統(tǒng)計(jì)數(shù)據(jù),對(duì)各個(gè)Region的回收價(jià)值和成本進(jìn)行排序,根據(jù)用戶設(shè)置的JVM暫停時(shí)間制定回收計(jì)劃,決定回收那一部分Region的存活對(duì)象復(fù)制到空的Region中,再清理掉整個(gè)舊的Region的全部空間。此過程設(shè)計(jì)到了存活對(duì)象的復(fù)制,需要STW。

?

五、G1的缺點(diǎn)

? ? ? ? 和CMS算法相比,G1優(yōu)點(diǎn)很多,最主要的是從整體上是基于”標(biāo)記-清除“算法實(shí)現(xiàn)的垃圾收集器,但從局部上,又是基于”標(biāo)記-復(fù)制“算法實(shí)現(xiàn),這標(biāo)志著G1在運(yùn)行期間不會(huì)產(chǎn)生內(nèi)存碎片,有利于程序長(zhǎng)時(shí)間運(yùn)行。

? ? ? ? G1相比CMS的弱點(diǎn)也有不少,主要表現(xiàn)就是G1的Remembered Set對(duì)內(nèi)存有更高的需求,某些極端情況下會(huì)達(dá)到堆空間的20%甚至更多,GC進(jìn)行時(shí)垃圾回收器的執(zhí)行負(fù)載較高,導(dǎo)致應(yīng)用的吞吐量不如CMS高。目前,在小內(nèi)存的堆上,CMS的表現(xiàn)大概率上仍然優(yōu)于G1;在大內(nèi)存的堆上,G1則更能發(fā)揮優(yōu)勢(shì),所以在小于6G~8G的堆上使用CMS可能有更好的性能,而在更大的堆上應(yīng)該優(yōu)先選擇G1。

?

參考資料

1、深入理解Java虛擬機(jī)-JVM高級(jí)特性與最佳實(shí)踐(第3版)

2、垃圾回收算法手冊(cè)

?

個(gè)人公眾號(hào):

? ? ? ? 自己在軟件這個(gè)行業(yè)10來年的工作和學(xué)習(xí)歷程中犯了不少錯(cuò)誤,也走了不少?gòu)澛?#xff0c;在此公眾號(hào)分享自己的成長(zhǎng)心路和工作心得,希望給后來的從業(yè)者一個(gè)參照,不要再犯我犯過的錯(cuò)誤,不要再走我走過的彎路。在此我也會(huì)分享工作中遇到的技術(shù)問題和自己研究技術(shù)的記錄與心得;在項(xiàng)目過程中遇到的風(fēng)險(xiǎn)和暴露于化解風(fēng)險(xiǎn)的過程和方法;在團(tuán)隊(duì)管理過程中的心得和體會(huì)。后續(xù)會(huì)發(fā)布一系列專題技術(shù)文章,程序員成長(zhǎng)系列文章,項(xiàng)目的系列文章,行業(yè)發(fā)展分析和展望的文章,甚至?xí)閼俸陀齼旱男牡梦恼?#xff0c;我是個(gè)不專注卻熱愛生活的工程師!

總結(jié)

以上是生活随笔為你收集整理的深入理解G1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。