日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

轻gc和重gc分别在什么时候发生_GC发展与现状

發(fā)布時(shí)間:2023/12/10 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 轻gc和重gc分别在什么时候发生_GC发展与现状 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

GC發(fā)展

Java不像C或C++那樣,需要程序員在編程的過程中,時(shí)刻注意申請(qǐng)內(nèi)存保存對(duì)象,在對(duì)象使用完成后,要在合適的時(shí)機(jī)將對(duì)象占用的內(nèi)存釋放掉(析構(gòu)函數(shù));Java得意與內(nèi)部的三大機(jī)制,保證了程序開發(fā)方便:

  • 解釋執(zhí)行+ 即時(shí)編譯器JIT,對(duì)熱點(diǎn)代碼的即時(shí)編譯執(zhí)行為機(jī)器,在方法區(qū)中保存代碼緩存;

  • 執(zhí)行引擎;

  • 垃圾回收機(jī)制;

我們今天的重點(diǎn)就是要闡述:垃圾回收機(jī)制。

為什么要進(jìn)行垃圾回收?

原因很簡(jiǎn)單:現(xiàn)在的計(jì)算機(jī)系統(tǒng)都是跑在程序存儲(chǔ)結(jié)果的計(jì)算機(jī)上的,程序必須首先通過IO加載到內(nèi)存中,才能開始創(chuàng)建程序進(jìn)程,開始運(yùn)行。而內(nèi)存的大小是有上限的,無休止地在內(nèi)存中創(chuàng)建對(duì)象,占用內(nèi)存,而不去清理,必然是會(huì)造成內(nèi)存不足,導(dǎo)致操作系統(tǒng)將應(yīng)用進(jìn)程殺死。

所以就需要java字節(jié)碼,要么字節(jié)碼中管理內(nèi)存,申請(qǐng)內(nèi)存,擴(kuò)展內(nèi)存,釋放內(nèi)存;要么JVM自己提供垃圾回收機(jī)制;


要進(jìn)行垃圾回收,首先就要知道,對(duì)象保存在哪里?什么樣的對(duì)象是垃圾?

對(duì)象保存在哪里?

對(duì)象在中保存,小的對(duì)象可能會(huì)保存在棧的TLAB中,JVM的內(nèi)存區(qū)域分五個(gè)部分,其實(shí)在實(shí)際中,java所使用的內(nèi)存包括有(后續(xù)補(bǔ)充)??

java內(nèi)存 = ?PC寄存器 + java棧 + 本地棧 + 年輕代 +老年代 + 直接內(nèi)存空間

堆的邏輯劃分

分別介紹如下:

程序計(jì)數(shù)器PC:是一塊較小的內(nèi)存空間,作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)的指示器,線程私有。

JVM方法棧和本地方法棧:在sun的jdk中,JVM方法棧和本地方法棧是算在一起的,虛擬機(jī)棧為虛擬機(jī)執(zhí)行java方法,本地方法棧為虛擬機(jī)執(zhí)行Native方法,線程私有。

java heap:是虛擬機(jī)中內(nèi)存區(qū)域最大的一塊,細(xì)分可以分為新生代和舊生帶,新生代可以劃分為E、S0、S1,其中S1和S0又可以叫做from 或 to,線程共享。

方法區(qū):存放了要加載的類的信息,類中的靜態(tài)變量,定義為final的常量,類中的Field信息,方法信息等,全局共享,又叫做持久帶,可以通過 ?-XX:PermSize和-XX:MaxPermSize設(shè)置最小值和最大值,線程共享。

各個(gè)區(qū)的作用

圖示:

新生代:

? ?大多數(shù)情況下,java中新建的對(duì)象都是在新生代上分配的,新生代由Eden和兩塊相同大小的S0和S1組成,其中S0和S1又稱為From和To(這個(gè)劃分沒有先后順序),可以通過-Xmn來設(shè)置新生代的大小,-XX:SurvivorRatio設(shè)置Eden和S區(qū)的比值,有些垃圾回收器會(huì)對(duì)S0或者S1進(jìn)行動(dòng)態(tài)的調(diào)整。

? ? 之所以說大多數(shù)情況下新建的對(duì)象在新生代上分配,是因?yàn)橛袃煞N情況下java新創(chuàng)建的對(duì)象會(huì)直接到舊生帶,一種是大的數(shù)組對(duì)象,且對(duì)象中無外部引用的對(duì)象,另外一種是通過

啟動(dòng)參數(shù)上面進(jìn)行設(shè)置-XX:PretenureSizeThreshold=1024(單位是字節(jié)),意思是對(duì)象超過此大小,就直接分配到老年代的堆內(nèi)存中,此外,并行垃圾回收器可以在運(yùn)行期決定那些對(duì)象可以直接創(chuàng)建在舊生帶。

老年代:

多次回收之后仍然存活的對(duì)象,大小是-Xms減去-Xmn。

常見的參數(shù)設(shè)置

-XX:+ 啟用選項(xiàng)

-XX:- 不啟用選項(xiàng)

-XX:= 給選項(xiàng)設(shè)置一個(gè)數(shù)字類型值,可跟單位,例如 32k, 1024m, 2g

-XX:= 給選項(xiàng)設(shè)置一個(gè)字符串值,例如-XX:HeapDumpPath=./dump.core

什么是垃圾對(duì)象

Java采用的是可達(dá)性分析法。

判斷對(duì)象是否為垃圾的方法有兩種:

  • 引用計(jì)數(shù)法

  • 可達(dá)性分析算法

可達(dá)性分析算法中,有個(gè)非非常常的概念:根集合,引用鏈:

根集合

(1)根集合,包含了一組對(duì)象,這些是對(duì)運(yùn)行時(shí)數(shù)據(jù)區(qū)的對(duì)象快照的掃描,主要包含有:

  • java虛擬機(jī)棧(棧幀中的本地變量表)中的引用的對(duì)象

  • 本地方法棧中JNI本地方法的引用對(duì)象。

  • 方法區(qū)中的類靜態(tài)屬性引用的對(duì)象

  • 方法區(qū)中的常量引用的對(duì)象。

  • 常駐的異常對(duì)象,鎖對(duì)象

  • 其他代的堆內(nèi)存中,對(duì)當(dāng)前回收內(nèi)存區(qū)域有引用關(guān)系的對(duì)象;比如:young gc時(shí),出現(xiàn)的老年代中的對(duì)象,G1回收時(shí)Region中的remember set對(duì)象

引用鏈

從根集合出發(fā),開始遍歷堆內(nèi)存中的對(duì)象,在引用鏈上的對(duì)象,就是正在使用的對(duì)象,不是垃圾;沒有在引用鏈上的對(duì)象,就是垃圾,垃圾回收器就要對(duì)其進(jìn)行回收處理。

STW的時(shí)機(jī)

為了確保堆內(nèi)存中的對(duì)象間的引用關(guān)系是不變的,在進(jìn)行確定根集合時(shí),需要將應(yīng)用程序暫時(shí)停頓,這也是后續(xù)垃圾回收器在努力奮斗進(jìn)行攻克的一個(gè)重要參數(shù),停頓時(shí)間,越小越好,吞吐量越大越好。

STW的時(shí)機(jī):

安全點(diǎn)

哪些時(shí)刻作為安全點(diǎn):

  • 方法開始執(zhí)行;

  • 方法返回之前;

  • 異常拋出

  • 進(jìn)入循環(huán)調(diào)用前

安全區(qū)域

哪些時(shí)間區(qū)域作為安全區(qū)域:

  • sleep()操作

  • 線程阻塞時(shí)


垃圾回收算法

三種垃圾回收算法和java最后選擇的回收算法

復(fù)制算法

所有的年輕代的收集算法

標(biāo)記-清除算法

CMS的垃圾回收算法

標(biāo)記-整理算法

Parallel old的收集算法

Java選擇的垃圾回收算法:分代回收算法,將堆內(nèi)存進(jìn)行邏輯劃分為:根據(jù)對(duì)象的年齡大小,劃分為年輕代,年老代保存,在不同的代,使用不同的回收算法。


垃圾回收器

第一階段 串性回收

用在客戶端模式的java虛擬機(jī)上,

暫停應(yīng)用線程,單線程地回收垃圾對(duì)象;

第二階段 并行回收

暫停應(yīng)用線程,啟動(dòng)多個(gè)GC線程地回收垃圾對(duì)象;

對(duì)比串性回收的速度高了,停頓的時(shí)間變短了,但是仍是在整個(gè)回收過程中,只有GC運(yùn)行,應(yīng)用線程是不工作的;

第三階段 并發(fā)回收

在GC的過程中,根據(jù)GC過程的不同階段,將部分階段設(shè)置為GC線程和應(yīng)用線程同時(shí)運(yùn)行,并且最大限度地減少GC造成的暫停時(shí)間,這個(gè)過程包括有:

  • 收集根對(duì)象;

  • 初始標(biāo)記

  • 并發(fā)標(biāo)記

  • 最終標(biāo)記

  • 并發(fā)清除

舉例:CMS垃圾回收器

第四階段 標(biāo)記和回收分離

標(biāo)記和回收都是并發(fā)的,并且標(biāo)記有標(biāo)記的觸發(fā)條件;

回收有回收的觸發(fā)條件,兩個(gè)條件相互影響。

舉例:G1,ZGC

CMS三個(gè)很重要的參數(shù)

  • -XX:CMSInitiatingOccupancyFraction

設(shè)置CMS收集器在老年代空間被使用多少(百分比)后觸發(fā)垃圾收集。默認(rèn)設(shè)置-XX:CMSInitiatingOccupancyFraction=68表示老年代空間使用比例達(dá)到68%時(shí)觸發(fā)CMS垃圾收集。僅當(dāng)老年代收集器設(shè)置為CMS時(shí)候這個(gè)參數(shù)才有效。

  • -XX:+UseCMSCompactAtFullCollection

設(shè)置CMS收集器在完成垃圾收集后是否要進(jìn)行一次內(nèi)存碎片整理。僅當(dāng)老年代收集器設(shè)置為CMS時(shí)候這個(gè)參數(shù)才有效。

  • -XX:CMSFullGCsBeforeCompaction

設(shè)置CMS收集器在進(jìn)行多少次垃圾收集后再進(jìn)行一次內(nèi)存碎片整理。如設(shè)置-XX:CMSFullGCsBeforeCompaction=2表示CMS收集器進(jìn)行了2次垃圾收集之后,進(jìn)行一次內(nèi)存碎片整理。僅當(dāng)老年代收集器設(shè)置為CMS時(shí)候這個(gè)參數(shù)才有效。

  • 日志有關(guān)的三個(gè)參數(shù):
    - -XX:+PrintGCDateStamps

-XX:+PrintGCDetails

-Xloggc

指定gc日志的存放位置。如-Xloggc:/var/log/myapp-gc.log表示將gc日志保存在磁盤/var/log/目錄,文件名為myapp-gc.log

到底Java GC是在什么時(shí)候,對(duì)什么東西,做了什么事情?

(1)時(shí)間:

JVM進(jìn)程啟動(dòng)后,就會(huì)不斷地在新生代中保存新創(chuàng)建的對(duì)象,當(dāng)Eden區(qū)滿了后觸發(fā)minor gc,用的是復(fù)制算法,當(dāng)Survivor中的一半以上的對(duì)象存活年齡大于平均年齡時(shí),或者對(duì)象的年齡大于設(shè)置的參數(shù):-XX:MaxTenuringThreshold時(shí),就會(huì)觸發(fā)對(duì)象晉升,從年輕代晉升到老年代保存,當(dāng)晉升到老年代的對(duì)象大小總和大于老年代剩余空間full gc時(shí),并且晉升擔(dān)保機(jī)制設(shè)置為ture時(shí),就會(huì)直接嘗試晉升,老年代內(nèi)存不足時(shí),觸發(fā)老年代full gc,或者小于時(shí)被HandlePromotionFailure參數(shù)強(qiáng)制full gc,gc與非gc的耗時(shí)比較后,超過了GCTimeRatio的限制引發(fā)OOM:

  • 通過參數(shù)NewRatio控制年輕代和老年代的堆空間的比例;

  • 通過參數(shù)SurvivorRatio控制年輕代中,伊甸園區(qū)和幸存者區(qū)的比例

  • 通過參數(shù):-XX:MaxTenuringThreshold設(shè)置從年輕代晉升到老年代的對(duì)象年齡,其中:CMS是默認(rèn):15,G1默認(rèn)是:6;

GC關(guān)鍵技術(shù)

三色標(biāo)記法

白色:還沒標(biāo)記,或者標(biāo)記為了垃圾對(duì)象;

灰色:標(biāo)記一半,屬性沒有標(biāo)記完成

黑色:自己和自己的屬性都已近全部標(biāo)記完成。

記憶集

用來保存其他堆內(nèi)存區(qū),對(duì)當(dāng)前GC線程作用的堆內(nèi)存區(qū)的引用關(guān)系;

卡表

用來記錄對(duì)其他代,或其他Region中的對(duì)象,有當(dāng)前card的引用指向時(shí),就將當(dāng)前card標(biāo)記為dirty,并且在垃圾回收時(shí),將dirty保存到drity card queue中;

目的:在進(jìn)行垃圾回收時(shí),防止對(duì)全堆進(jìn)行掃描,從而降低并發(fā)標(biāo)記或最終標(biāo)記的暫停時(shí)間;

全稱是Remembered Set,是輔助GC過程的一種結(jié)構(gòu),典型的空間換時(shí)間工具,和Card Table有些類似。還有一種數(shù)據(jù)結(jié)構(gòu)也是輔助GC的:Collection Set(CSet),它記錄了GC要收集的Region集合,集合里的Region可以是任意年代的。在GC的時(shí)候,對(duì)于old->young和old->old的跨代對(duì)象引用,只要掃描對(duì)應(yīng)的CSet中的RSet即可。

邏輯上說每個(gè)Region都有一個(gè)RSet,RSet記錄了其他Region中的對(duì)象引用本Region中對(duì)象的關(guān)系,屬于points-into結(jié)構(gòu)(誰引用了我的對(duì)象)。而Card Table則是一種points-out(我引用了誰的對(duì)象)的結(jié)構(gòu),每個(gè)Card 覆蓋一定范圍的Heap(一般為512Bytes)。G1的RSet是在Card Table的基礎(chǔ)上實(shí)現(xiàn)的:每個(gè)Region會(huì)記錄下別的Region有指向自己的指針,并標(biāo)記這些指針分別在哪些Card的范圍內(nèi)。這個(gè)RSet其實(shí)是一個(gè)Hash Table,Key是別的Region的起始地址,Value是一個(gè)集合,里面的元素是Card Table的Index。

下圖表示了RSet、Card和Region的關(guān)系:

SATB

當(dāng)G1開始進(jìn)行回收時(shí),為了確保堆內(nèi)存中,對(duì)象之間的引用關(guān)系不變,而獲取一個(gè)內(nèi)存快照,進(jìn)行并發(fā)標(biāo)記的作用對(duì)象就是這個(gè)SATB內(nèi)存快照;

CMS和G1算法都涉及對(duì)可達(dá)對(duì)象的并發(fā)標(biāo)記。并發(fā)標(biāo)記的主要問題是collector在標(biāo)記對(duì)象的過程中mutator可能正在改變對(duì)象引用關(guān)系圖,從而造成漏標(biāo)和錯(cuò)標(biāo)。錯(cuò)標(biāo)不會(huì)影響程序的正確性,只是造成所謂的浮動(dòng)垃圾。但漏標(biāo)則會(huì)導(dǎo)致可達(dá)對(duì)象被當(dāng)做垃圾收集掉,從而影響程序的正確性。

為解決漏標(biāo)問題,GC Handbook一書首先將對(duì)象分為三類,即所謂的black對(duì)象,grey對(duì)象和white對(duì)象。white對(duì)象是那些還沒有被collector標(biāo)記到的對(duì)象;grey對(duì)象是那些自身已經(jīng)被標(biāo)記到,但其所有引用字段還沒有處理的對(duì)象;而black對(duì)象則是自身已經(jīng)被標(biāo)記到,且其引用的所有對(duì)象也已經(jīng)被標(biāo)記的對(duì)象。

基于上述分類,一個(gè)white對(duì)象在并發(fā)標(biāo)記階段會(huì)被漏標(biāo)的充分必要條件是:

1、mutator插入了一個(gè)從black對(duì)象到該white對(duì)象的新引用

2、mutator刪除了所有從grey對(duì)象到該white對(duì)象的直接或者間接引用。

因此,要避免對(duì)象的漏標(biāo),只需要打破上述2個(gè)條件中的任何一個(gè)即可。

CMS:

Incremental update關(guān)注的是第一個(gè)條件的打破,即引用關(guān)系的插入。Incremental update利用write barrier將所有新插入的引用關(guān)系都記錄下來,最后以這些引用關(guān)系的src為根STW地重新掃描一遍即避免了漏標(biāo)問題。

G1:

SATB關(guān)注的是第二個(gè)條件的打破,即引用關(guān)系的刪除。SATB利用pre write barrier將所有即將被刪除的引用關(guān)系的舊引用記錄下來,最后以這些舊引用為根STW地重新掃描一遍即可避免漏標(biāo)問題。

在G1中,使用的是STAB(snapshot-at-the-beginning)的方式,刪除的時(shí)候記錄所有的對(duì)象,它有3個(gè)步驟:

1,在開始標(biāo)記的時(shí)候生成一個(gè)快照?qǐng)D標(biāo)記存活對(duì)象

2,在并發(fā)標(biāo)記的時(shí)候所有被改變的對(duì)象入隊(duì)(在write barrier里把所有舊的引用所指向的對(duì)象都變成非白的)

3,可能存在游離的垃圾,將在下次被收集

G1的寫前屏障

G1在并發(fā)標(biāo)記過程中,當(dāng)對(duì)象與對(duì)象之間的引用關(guān)系發(fā)生變化時(shí),就會(huì)將引用斷開的對(duì)象,保存起來,在并發(fā)階段的后期,重新對(duì)這些對(duì)象進(jìn)行掃描標(biāo)記;

目的:防止對(duì)象消失,

CMS的增量更新

CMS在進(jìn)行并發(fā)標(biāo)記過程中,當(dāng)對(duì)象間的引用關(guān)系發(fā)生變化時(shí),就會(huì)引用發(fā)生變化的對(duì)象,利用增量更新的條件,使用寫后屏障技術(shù)保存起來,在最終標(biāo)記階段,將會(huì)把根集合和并發(fā)標(biāo)記階段引用發(fā)生變化的對(duì)象為新的根集合,重新掃描一遍所有的對(duì)象;

目的:防止對(duì)象消失;

缺點(diǎn):可能存在浮動(dòng)垃圾;

染色指針

多個(gè)虛擬內(nèi)存地址,根據(jù)地址中特殊位置的標(biāo)記位,用來表示哪個(gè)地址段是有效的,從而實(shí)現(xiàn)多個(gè)虛擬內(nèi)存地址,對(duì)應(yīng)一個(gè)物理內(nèi)存地址,可支持最大內(nèi)存空間為:

16T;

G1的標(biāo)記過程

概述

STAB全稱Snapshot-At-The-Beginning,由字面理解,是GC開始時(shí)活著的對(duì)象的一個(gè)快照。它是通過Root Tracing得到的,作用是維持并發(fā)GC的正確性。那么它是怎么維持并發(fā)GC的正確性的呢?根據(jù)三色標(biāo)記算法,我們知道對(duì)象存在三種狀態(tài):

  • 白:對(duì)象沒有被標(biāo)記到,標(biāo)記階段結(jié)束后,會(huì)被當(dāng)做垃圾回收掉,即灰色節(jié)點(diǎn)的子節(jié)點(diǎn)。

  • 灰:對(duì)象被標(biāo)記了,但是它的field還沒有被標(biāo)記或標(biāo)記完。

  • 黑:對(duì)象被標(biāo)記了,且它的所有field也被標(biāo)記完了。

由于并發(fā)階段的存在,那就有可能在并行運(yùn)行期間之前的標(biāo)記過的對(duì)象的引用關(guān)系可能被改變,就會(huì)出現(xiàn)白對(duì)象漏標(biāo)的情況,這種情況發(fā)生的前提是:

  • 把一個(gè)白對(duì)象的引用存到黑對(duì)象的字段里,如果這個(gè)情況發(fā)生,因?yàn)闃?biāo)記為黑色的對(duì)象認(rèn)為是掃描完成的,不會(huì)再對(duì)它進(jìn)行掃描。

  • 某個(gè)白對(duì)象失去了所有能從灰對(duì)象到達(dá)它的引用路徑。

對(duì)于第一個(gè)條件,在并發(fā)標(biāo)記階段,如果該白對(duì)象是new出來的,并沒有被灰對(duì)象持有,那么它會(huì)不會(huì)被漏標(biāo)呢?

如果灰對(duì)象到白對(duì)象的直接引用或者間接引用被替換了,或者刪除了,白對(duì)象就會(huì)被漏標(biāo),從而導(dǎo)致被回收掉,這是非常嚴(yán)重的錯(cuò)誤。

解決新創(chuàng)建對(duì)象產(chǎn)生的漏標(biāo)問題

??????? SATB算法機(jī)制中,會(huì)在GC開始時(shí)先創(chuàng)建一個(gè)對(duì)象快照,在并發(fā)標(biāo)記時(shí)所有快照中當(dāng)時(shí)的存活對(duì)象就認(rèn)為是存活的,標(biāo)記過程中新分配的對(duì)象也會(huì)被標(biāo)記為存活對(duì)象,不會(huì)被回收。這種機(jī)制能夠很好解決新創(chuàng)建對(duì)象漏標(biāo)的情況。STAB核心的兩個(gè)結(jié)構(gòu)就是兩個(gè)Bitmap。

?????? Bitmap分別存儲(chǔ)在每個(gè)Region中,并發(fā)標(biāo)記過程里的兩個(gè)重要的變量:preTAMS(pre-top-at-mark-start,代表著Region上一次完成標(biāo)記的位置) 以及nextTAMS(next-top-at-mark-start,隨著標(biāo)記的進(jìn)行會(huì)不斷移動(dòng),一開始在top位置)。SATB通過控制兩個(gè)變量的移動(dòng)來進(jìn)行標(biāo)記,移動(dòng)規(guī)則如下:

  • 假設(shè)第n輪并發(fā)標(biāo)記開始,將該Region當(dāng)前的Top指針賦值給nextTAMS,在并發(fā)標(biāo)記標(biāo)記期間,分配的對(duì)象都在[ nextTAMS, Top ]之間,SATB能夠確保這部分的對(duì)象都會(huì)被標(biāo)記,默認(rèn)都是存活的。

  • 當(dāng)并發(fā)標(biāo)記結(jié)束時(shí),將nextTAMS所在的地址賦值給previousTAMS,SATB給[ Bottom, previousTAMS ]之間的對(duì)象創(chuàng)建一個(gè)快照Bitmap,所有垃圾對(duì)象能通過快照被識(shí)別出來。

  • 第n+1輪并發(fā)標(biāo)記開始,過程和第n輪一樣。

  • A階段,初始標(biāo)記階段,需要STW,將掃描Region的Top值賦值給nextTAMS。

  • A-B階段:并發(fā)標(biāo)記階段。

  • B階段,并發(fā)標(biāo)記結(jié)束階段,此時(shí)并發(fā)標(biāo)記階段生成的新對(duì)象都會(huì)被分配在[nextTAMS,Top]之間,這些對(duì)象會(huì)被定義為“隱式對(duì)象”,同時(shí)_next_mark_bitmap也開始存儲(chǔ)nextTAMS標(biāo)記的對(duì)象的地址。

  • C階段,清除階段,_next_mark_bitmap和_prev_mark_bitmap會(huì)進(jìn)行交換,同時(shí)清理[ Bottom, previousTAMS ]之間被標(biāo)記的所有對(duì)象,對(duì)于“隱式對(duì)象”會(huì)在下次垃圾收集過程進(jìn)行回收(如第F步),這也是SATB存在弊端,會(huì)一定程度產(chǎn)生未能在本次標(biāo)記中識(shí)別的浮動(dòng)垃圾。

解決對(duì)象引用被修改產(chǎn)生的漏標(biāo)問題

??????? SATB利用pre-write barrier,將所有即將被修改引用關(guān)系的白對(duì)象舊引用記錄下來,最后以這些舊引用為根重新掃描一遍,以解決白對(duì)象引用被修改產(chǎn)生的漏標(biāo)問題。

在引用修改時(shí)把原引用保存到satb_mark_queue中,每個(gè)線程都自帶一個(gè)satb_mark_queue。在下一次的并發(fā)標(biāo)記階段,會(huì)依次處理satb_mark_queue中的對(duì)象,確保這部分對(duì)象在本輪GC中是存活的。

????????如果被修改引用的白對(duì)象就是要被收集的垃圾,這次的標(biāo)記會(huì)讓它躲過GC,這就是float garbage。因?yàn)镾ATB的做法精度比較低,所以造成的float garbage也會(huì)比較多。

總結(jié)

  • ?本文主要對(duì)GC發(fā)展做了詳述,分布式高并發(fā)的環(huán)境,造就了GC不斷發(fā)展,要在最短的時(shí)間內(nèi),給用戶響應(yīng)最多的返回?cái)?shù)據(jù),就需要后端服務(wù)有很強(qiáng)的響應(yīng)能力;

  • 就需要GC的暫停時(shí)間段,GC回收的效率越高越好。

  • 總結(jié)

    以上是生活随笔為你收集整理的轻gc和重gc分别在什么时候发生_GC发展与现状的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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