溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹

發(fā)布時間:2021-08-02 09:47:36 來源:億速云 閱讀:230 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

判斷對象存活方法

引用計數(shù)法:在對象中添加一個引用計數(shù)子,每當一個地方引用他時,計數(shù)器就加一,當引用失效時,計數(shù)器就減一。

會有對象循環(huán)引用問題:

objA.instance = objB
objB.instance = objA

objA 有objB 的引用 objB 有 objA 的引用,他們相互引用著對方。導(dǎo)致他們無法回收。

可達性分析:

從GC Roots 根對象作為起點,根據(jù)引用關(guān)系向下搜索,如果對象可達,就說明對象存活,如果對象不可達,就說明對象可以被回收。

GC Roots的根對象為:

1)在虛擬機棧 棧幀中的 本地變量表 中引用的對象

2)方法區(qū)靜態(tài)屬性引用的對象

3)方法區(qū)常量引用 的對象,如字符串常量池中的引用

4)本地方法棧中JNI引用的對象

5)虛擬機內(nèi)部引用的對象,如基本數(shù)據(jù)類型對應(yīng)的Class對象,一些常駐的異常對象等,還有系統(tǒng)類加載器

6)被同步鎖持有的對象

收集線程和用戶線程在并發(fā)可達性分析

并發(fā) 的可達性分析,由于用戶線程會即時修改對象的引用關(guān)系, 可能會造成兩種異常:

1)原本消亡的對象錯誤標記為存活,這個可以接受,就造成浮動垃圾,下一次收集即可。

2)原本存活的對象 標記為 消失。

三色法分析圖:

java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹

黑色:已經(jīng)掃描過的對象

灰色:已經(jīng)訪問過,但還有一個引用沒有被掃描

白色:為被訪問過,若到最后還是白色,說明此對象是需要回收的。

黑色誤標記為白色有兩個條件

1)復(fù)制器插入一條或多條從黑色對象到白色對象的新引用

2)復(fù)制器刪除了全部從灰色對象到該白色對象的直接或間接的引用

解決方法:

1)增量更新,破壞條件1,把黑色對象對白色對象的新增引用記錄下來,等并發(fā)掃描結(jié)束后,再以這些對象出發(fā)重新掃描。

2)原始快照(SATB),破解條件2,當灰色對象要刪除對白色對象的引用關(guān)系時,記錄下來。并發(fā)結(jié)束后再以記錄節(jié)點開始重新掃描。

分代收集

堆:

新生代(1/3) 老年代(2/3)

新生代 分為 Eden/From/To

新生代存放:比較小,時長比較小

老年代:比較大 存放時長比較大

輕GC

重GC(full GC) -> STW(停止事件),fallGc特別費資源

Eden -> from <-> To -> old

對象在from和to循環(huán)15(默認)次之后,會放到老年代

垃圾收集算法

標記-清除 算法:

算法分為標記 和 清除兩個階段,首先標記出所需要回收的對象,標記完成之后,統(tǒng)一回收所標記的對象。

優(yōu)點:最基礎(chǔ)的算法,實現(xiàn)簡單

缺點:1)執(zhí)行效率不穩(wěn)定,對象越多,效率越低

2)內(nèi)存碎片化,需要分配大對象時可能無足夠連續(xù)的空間。

代表垃圾收集器:

標記復(fù)制算法(復(fù)制算法):

把內(nèi)存分為大小相等的兩塊,每次只使用其中一款,當一塊快用完時,它將存活的對象復(fù)制到另一塊上。

優(yōu)點:能產(chǎn)生連續(xù)的空間

缺點:耗內(nèi)存,對象存活率較高時,效率會降低(不適合老年代)。

代表垃圾收集器: 很多新生代的回收,都用這種算法。

標記整理 算法

首先標記出所需要的對象,標記完成后,對存活對象移動到內(nèi)存的一段,然后清除邊界外的對象。

優(yōu)點:有連續(xù)的內(nèi)存空間;系統(tǒng)吞吐量(用戶線程和收集器的效率總和)會提高。

缺點:整理內(nèi)存耗時會比較大,會造成 “Stop The World”;

代表垃圾收集器:Parallel Scavenge收集器

CMS中主要用標記清除算法,但是當內(nèi)存碎片化到影響對象分配時,就會使用一次標記整理算法 去整理內(nèi)存碎片。

垃圾收集器

Serial收集器

最基礎(chǔ)最悠久的垃圾收集器,叫做 串行收集器,它進行垃圾收集的時候,會停止用戶線程(Stop the world)。

新生代垃圾收集器用 Serial,基于復(fù)制算法

老年代垃圾收集器用 Serial Old,基于標記整理算法。

java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹

優(yōu)點:所有垃圾收集器中內(nèi)存消耗最小的,對單核或單線程處理器來說,效率很高。運行在客戶端

缺點:stop the world

ParNew收集器

ParNew收集器就是Serial收集器的多線程并行版,除了支持多線并行收集之外,沒有太多創(chuàng)新之處。

java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹

CMS垃圾收集器作為老年代垃圾收集器,不能與Parallel Scavenge配合工作,只能選擇 ParNew或者Serial收集器。

Parallel Scavenge收集器

新生代垃圾收集器,基于 標記復(fù)制算法,也是可以通過并行收集的多線程收集器。他關(guān)注 吞吐量(用戶線程時間/總時間)。

java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹

CMS 垃圾收集器

CMS 收集器是一種以獲取最短停頓時間作為目標的垃圾收集器?;跇擞浨宄惴?。

步驟:

初始標記->并發(fā)標記->重新標記->并發(fā)清除

java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹

1)初始標記:stop the world,標記GC ROOT 能直接關(guān)聯(lián)的對象,速度很快

2)并發(fā)標記:從GC Root直接關(guān)聯(lián)的對象開始遍歷整個對象圖,時間較長,但與用戶線程并行

3)重新標記:stop the world,修正并發(fā)標記期間對象的狀態(tài)的改變(增量更新算法,標記新的黑色指向白色的引用),時間也比較短。

4)并發(fā)清除:與用戶線程同步。

優(yōu)點:并發(fā)收集、低停頓。

缺點:

1)對處理器資源敏感,當處理器核心數(shù)量在四個以下時,CMS對用戶程序影響很大。

2)有浮動垃圾,并發(fā)標記時會產(chǎn)生新的垃圾,但是CMS本次不會清理它,要等到下一次才會清理。從而可能造成內(nèi)存不夠而產(chǎn)生Stop the world 的Full GC

3)基于標記清除算法,會產(chǎn)生大量的空間碎片,而觸發(fā)Full GC

G1垃圾收集器

關(guān)注吞吐量和延遲時間的最佳平衡。

從整體看,主要采用標記整理算法,從局部看,是標記-復(fù)制算法(兩個Region 之間的復(fù)制)。

G1把 java對 劃分為多個大小相等獨立區(qū)域 Region,每一個Region 都可以根據(jù)需要,扮演 Eden空間、Survivor空間或者老年代空間。

G1對年代的劃分存在概念上,它可以不是連續(xù)的區(qū)間。。

Region 還有一類特殊的Humongous區(qū)域,專門存儲大對象(1M-32M,可配),把超過Region大小的對象分配在連續(xù)的 Humongous Region之中。

每次收集時以Region作為最小單元,G1收集器去根據(jù)Region里面垃圾隊的價值大小,在后臺維護一個優(yōu)先級列表,優(yōu)先處理回收價值收益最大的那些Region(每次收集到的內(nèi)存大小及回收時間的經(jīng)驗值)。

G1至少耗費打印java堆容量的10%到20%來維持收集工作。

TAMS指針:在并發(fā)過程中保存新建的對象。

STAB:灰色引用對白色引用的刪除 記錄下來。

G1的步驟:

1)初始標記:stop the world,僅僅標記GC ROOTs 能直接關(guān)聯(lián)的對象,并且修改TAMS指針

2)并發(fā)標記:從GC ROOTS 直接關(guān)聯(lián)的對象出發(fā),掃描對象圖(并還要處理SATB記錄下并時有變動的對象),時間長,但是與用戶線程并行,

3)最終標記:stop the world,短暫,處理遺留下來的少量SATB記錄

4)帥選回收:stop the world,負責更新Region的統(tǒng)計數(shù)據(jù),對Region的回收價值和成本進行排序。根據(jù)用戶所期望的停頓時間(JVM參數(shù)可配)來制定回收計劃??梢宰杂蛇x擇多個Region作為回收集,然后把存活的對象復(fù)制到空的Region中,然后清空回收集的Region。

除了并發(fā)標記外,其它都用停止用戶線程,目標不是單純的追求低延遲,而是延遲可控的情況下獲取最大的吞吐量(用戶線程時間/總時間,總時間為用戶線程時間+垃圾收集時間)。

java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹

“java中的垃圾回收機制以及經(jīng)典垃圾回收器的詳細介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI