溫馨提示×

溫馨提示×

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

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

什么是三色標(biāo)記

發(fā)布時(shí)間:2021-10-12 16:13:34 來源:億速云 閱讀:413 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“什么是三色標(biāo)記”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

【1】關(guān)于三色標(biāo)記

前幾天,公司臨時(shí)派我去面試一個(gè)java實(shí)習(xí)生,由于沒有這方面的任何經(jīng)驗(yàn),于是一不小心,我就問超綱了。

問過了java基礎(chǔ),我隨口又問了一句,知道三色標(biāo)記嗎?

他顯然是懵逼了一瞬間,但也僅僅一瞬間,然后振振有詞地反問,是紅黃藍(lán)三色標(biāo)記嗎?

這倒是反把我問住了。

面試有問題答不出來,這其實(shí)可以理解,不懂就說不懂,不會(huì)就說不會(huì),子曾經(jīng)曰過,知之為知之。

三色標(biāo)記,正經(jīng)來說,就只有黑白灰三個(gè)顏色。

但實(shí)際上,三色標(biāo)記,和顏色其實(shí)沒有任何關(guān)系,只與一次掃描狀態(tài)相關(guān)。

  • 黑色節(jié)點(diǎn),代表根節(jié)點(diǎn)或者已掃描完的節(jié)點(diǎn),該節(jié)點(diǎn)的子節(jié)點(diǎn)也被掃描完;

  • 灰色節(jié)點(diǎn),代表已掃描完的節(jié)點(diǎn),該節(jié)點(diǎn)的子節(jié)點(diǎn)存在未被掃描的情況;

  • 白色節(jié)點(diǎn),代表未被掃描的節(jié)點(diǎn)。

什么是三色標(biāo)記

上圖中,A就是黑色節(jié)點(diǎn),B為灰色,因?yàn)锽的子節(jié)點(diǎn)C未被掃描,C則是白色節(jié)點(diǎn)。

如果,掃描結(jié)束,C依舊是白色,則C被回收。

但這里會(huì)存在一個(gè)問題,如果在上圖的情況下,BC的引用斷掉,而AC的引用被建立,如下圖:

什么是三色標(biāo)記

則會(huì)出現(xiàn)以下情況:

  • B掃描完,無引用,變黑。

  • C,按道理說,也會(huì)變灰,然后變黑。

  • 但A此時(shí)已經(jīng)是黑色節(jié)點(diǎn),則不會(huì)掃描其引用,所以C不會(huì)被掃描,還是白色。

  • 最后,C會(huì)被當(dāng)垃圾回收。

這顯然是一個(gè)誤操作,因?yàn)镃當(dāng)前是根可達(dá)的,那該問題怎么辦呢?

常用的垃圾回收器,CMS和G1都給出了解決方案。

CMS的方法叫做Incremental Update算法。

該算法從結(jié)果入手,判斷掃描完結(jié)時(shí),是否有白色對(duì)象被黑色對(duì)象引用,如果被引用,則通過write barrier寫屏障技術(shù),把黑色的對(duì)象重新標(biāo)記為灰色,然后重新掃描。

什么是三色標(biāo)記

G1的方法叫做SATB算法。

該算法從源頭入手,GC開始之前拍攝快照,設(shè)定所有存在引用的對(duì)象,都是存活的。

GC掃描之后,再次拍攝快照,將新引用的存活對(duì)象標(biāo)記。

然后將快照疊加。

什么是三色標(biāo)記

這樣,C顯示的是被A,B兩個(gè)對(duì)象引用。

但這樣會(huì)有一個(gè)弊端,如果此時(shí),AC之間的引用沒有被建立,則C本來應(yīng)該被回收,但此輪卻并沒有被回收。

【2】跨代引用的問題

跨代引用這個(gè)概念被提出來的時(shí)候,很多人都有似曾相識(shí)的感覺。但具體要說,很多人就說不出所以然來了。

其實(shí),java堆說到底就兩個(gè)代(年輕代和老年代),持久代在jdk的某個(gè)版本后,就被放到本地方法棧了。

跨代引用,即父節(jié)點(diǎn)在一個(gè)代,而引用對(duì)象在另一個(gè)代。

一般來說,父節(jié)點(diǎn)都在老年代,引用對(duì)象在年輕代。

什么是三色標(biāo)記

如上圖,X引用和Y引用都是屬于跨代引用。

跨代引用一般多發(fā)生在G1回收器中,因?yàn)镚1的內(nèi)存采用分塊的模式,內(nèi)存區(qū)域不穩(wěn)定。

那么,年輕代回收(young GC)時(shí),是否要根據(jù)可達(dá)性分析,遍歷所有的老年代關(guān)聯(lián),直到根節(jié)點(diǎn)呢。

不需要。

只要父節(jié)點(diǎn)在老年代,則一律視為根節(jié)點(diǎn)。

在這里(跨代引用)要引入兩個(gè)概念,結(jié)果集和卡表??ū砜梢钥醋饕粋€(gè)老年代分區(qū)的集合或者數(shù)組,如下圖。

什么是三色標(biāo)記

結(jié)果集,就是一組類似于map的容器,key存放卡表的下標(biāo),value存放引用關(guān)系

什么是三色標(biāo)記

想想這樣做的好處是什么?

【3】安全點(diǎn)和安全區(qū)域

java工作線程和垃圾回收線程,一般情況下,是不能同時(shí)進(jìn)行的。

通常老師講到這個(gè)問題的時(shí)候,會(huì)打個(gè)比方:吃飯和洗碗擦桌子。

之所以工作線程和垃圾回收線程不能同時(shí)進(jìn)行,是因?yàn)槿瞬荒芤贿叧燥堃贿吺帐巴肟辏ㄓ|手怪除外)。

同理,還有一個(gè)問題,你也不能把飯吃到一半,把碗拿過去洗。

所以,你必須在吃完飯的時(shí)候,洗碗。

吃完飯的這個(gè)時(shí)間,就是安全點(diǎn)。

一般來說,安全點(diǎn)是某個(gè)線程的結(jié)束或者中斷的時(shí)間,可以是方法調(diào)用,循環(huán)跳轉(zhuǎn),異常跳轉(zhuǎn)等。

再回頭說說垃圾回收的全過程。

  • 業(yè)務(wù)線程執(zhí)行過程中,會(huì)不斷輪詢一個(gè)標(biāo)志位,該標(biāo)志位處于垃圾回收線程中;

  • 如果需要做垃圾回收,回收線程會(huì)將標(biāo)志位改掉;

  • 業(yè)務(wù)線程收到標(biāo)志位信息,會(huì)走到安全點(diǎn),然后停止;

  • 垃圾回收線程啟動(dòng),回收垃圾。

什么是三色標(biāo)記

那么,安全區(qū)域是什么呢?

一個(gè)區(qū)域所有的點(diǎn)都是安全點(diǎn),這一部分就是安全區(qū)域。

還是拿原來那個(gè)例子,如果你晚上減肥,不想吃飯,碗什么的,隨時(shí)都可以洗。

【4】如何查看GC日志

直接上命令:-XX+PrintGCDetails。

該命令可以在控制臺(tái)打印GC日志。

日志內(nèi)容如下:

什么是三色標(biāo)記

【5】終:垃圾回收各指標(biāo)

吞吐量:指在應(yīng)用程序的生命周期內(nèi),應(yīng)用程序所花費(fèi)的時(shí)間和系統(tǒng)總運(yùn)行時(shí)間的比值。

公式:吞吐量=系統(tǒng)應(yīng)用時(shí)間/系統(tǒng)總運(yùn)行時(shí)間

垃圾回收器負(fù)載:和吞吐量正好相反,垃圾回收器負(fù)載指垃圾回收器耗時(shí)與系統(tǒng)運(yùn)行總時(shí)間的比值。

公式:吞吐量=垃圾回收時(shí)間/系統(tǒng)總運(yùn)行時(shí)間

停頓時(shí)間(延遲):指垃圾回收器正在運(yùn)行時(shí),應(yīng)用程序的暫停時(shí)間。

PS:獨(dú)占回收器延遲長,但吞吐量高,并發(fā)回收器,延遲少,但吞吐量低。

垃圾回收頻率:指垃圾回收器多長時(shí)間會(huì)運(yùn)行一次。

PS:垃圾回收器的頻率應(yīng)該是越低越好。

反應(yīng)時(shí)間:指當(dāng)一個(gè)對(duì)象被稱為垃圾后多長時(shí)間內(nèi),它所占據(jù)的內(nèi)存空間會(huì)被釋放。

PS:即垃圾回收的周期

over~~

堆分配:不同的垃圾回收器對(duì)堆內(nèi)存的分配方式可能是不同的。一個(gè)良好的垃圾收集器應(yīng)該有一個(gè)合理的堆內(nèi)存區(qū)間劃分。

“什么是三色標(biāo)記”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

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

AI