偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

圖解JVM如何解決對象跨代引用的問題

開發(fā) 前端
?記憶集是一種概念,在hotspot使用名為“卡表”(Cardtable)的方式實(shí)現(xiàn)記憶集,它也是目前最常用的一種方式。卡表使用一個(gè)字節(jié)數(shù)組來實(shí)現(xiàn):CARD_TABLE[],每個(gè)元素對應(yīng)著其標(biāo)識的內(nèi)存區(qū)域一塊特定大小的內(nèi)存塊,我們稱之為“卡頁”。

    在新生代做GCRoots可達(dá)性掃描過程中,可能會碰到跨代引用的對象的問題,如下圖所示:

圖片圖片

    在新生代掃面的時(shí)候會掃描不到D對象,如果這個(gè)D對象不去老年代掃描是否有被引用,那么就會無法觸達(dá),如下如所示:

圖片圖片

    但是D對象是有被引用的,如果直接回收D對象就會造成一些意想不到的問題,如果為了掃描D對象是否存在跨代引用而對老年代整體掃描一遍,就會帶來整個(gè)垃圾回收的效率低下的問題。

    為了解決跨代引用的問題,可以在新生代可以引入RememberSet(記錄從非收集區(qū)到收集區(qū)的指針集合)的數(shù)據(jù)結(jié)構(gòu),稱為記憶集,這樣避免把整個(gè)老年代加入到GCRoots掃描范圍中,如下所示:

圖片圖片

    記憶集是一種概念,在hotspot使用名為“卡表”(Cardtable)的方式實(shí)現(xiàn)記憶集,它也是目前最常用的一種方式??ū硎褂靡粋€(gè)字節(jié)數(shù)組來實(shí)現(xiàn):CARD_TABLE[],每個(gè)元素對應(yīng)著其標(biāo)識的內(nèi)存區(qū)域一塊特定大小的內(nèi)存塊,我們稱之為“卡頁”,如下圖所示:

圖片圖片

    將老年代按照一個(gè)卡頁大?。?12字節(jié))分成n個(gè)區(qū)域,這個(gè)區(qū)域的地址信息都記錄到卡表中。當(dāng)某個(gè)區(qū)域中出現(xiàn)跨代引用的時(shí)候,我們就在卡表中記錄信息,如下所示:

圖片圖片

    老年代的F對象引用了年輕代的D對象,那么我們就在卡表中記錄a卡頁中有跨代引用(設(shè)置對應(yīng)區(qū)域的值為1,如上a=1;卡頁b沒有跨代引用,設(shè)置b=0來表示此區(qū)域無跨代引用)。

    當(dāng)年輕代做GCRoots掃描的時(shí)候,我們?nèi)タū碇胁樵兡男﹨^(qū)域存在跨代的對象,然后判斷這個(gè)對象是否還繼續(xù)存活,如下所示:

圖片圖片

    一個(gè)卡頁中可包含多個(gè)對象,只要有一個(gè)對象存在跨代引用,那么其對應(yīng)在卡表中的元素標(biāo)識就設(shè)置成1,表示該區(qū)域存在跨代引用,否則為0。GC時(shí)只要篩選本收集區(qū)的卡表中為1區(qū)域中的元素加入GCRoots里(如上圖中a=1就被篩選出來做GCRoots)。

    通過卡表的方式我們就避免了大規(guī)模的掃描老年代對象,假設(shè)老年代有上萬的對象存活,年輕代之后幾十個(gè)存活對象,通過卡表我們只需要掃面少部分的老年代對象,大大的提升垃圾收集的效率。

    在hotspot使用寫屏障維護(hù)卡表中數(shù)據(jù)狀態(tài),當(dāng)老年代引用了新生代的對象時(shí)候,底層會維護(hù)將卡表中的對應(yīng)的區(qū)域設(shè)置為1。

責(zé)任編輯:武曉燕 來源: 龍蝦編程
相關(guān)推薦

2024-10-29 16:41:24

SpringBoot跨域Java

2021-06-06 13:05:15

前端跨域CORS

2022-03-11 10:01:47

開發(fā)跨域技術(shù)

2011-05-17 13:22:50

SQL對象名無效

2010-03-18 14:54:57

Java SynDem

2022-09-07 07:05:25

跨域問題安全架構(gòu)

2022-02-22 11:54:05

跨域項(xiàng)目前后端

2023-02-15 07:03:41

跨域問題面試安全

2023-04-07 10:51:39

2012-09-05 11:09:15

SELinux操作系統(tǒng)

2017-10-17 09:21:06

2010-04-29 17:46:31

Oracle死鎖

2009-09-21 17:10:14

struts Hibe

2021-10-20 20:27:55

MySQL死鎖并發(fā)

2024-12-05 09:06:58

2023-07-18 16:05:00

IP地址

2019-11-26 14:30:20

Spring循環(huán)依賴Java

2022-10-13 14:11:29

瀏覽器域名端口

2010-03-11 18:09:33

Python正則表達(dá)式

2017-07-20 07:30:16

大數(shù)據(jù)數(shù)據(jù)互聯(lián)網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號