更新時(shí)間:2022-06-15 來(lái)源:黑馬程序員 瀏覽量:
解釋?zhuān)?/p>
1.找到GCRoot對(duì)象,即那些一定不會(huì)被回收的對(duì)象,如正執(zhí)行方法內(nèi)局部變量引用的對(duì)象、靜態(tài)變量引用的對(duì)象
2.標(biāo)記階段:沿看GC Root對(duì)象的引用鏈找,直接或間接引用到的對(duì)象加上標(biāo)記
3.清除階段:釋放未加標(biāo)記的對(duì)象占用的內(nèi)存
要點(diǎn):
·標(biāo)記速度與存活對(duì)象線性關(guān)系
·清除速度與內(nèi)存大小線性關(guān)系
·缺點(diǎn)是會(huì)產(chǎn)生內(nèi)存碎片
需要先找到 GC Root 對(duì)象,即那些一定不會(huì)被回收的對(duì)象,如正執(zhí)行方法內(nèi)局部變量引用的對(duì)象、靜態(tài)變量引用的對(duì)象。
標(biāo)記階段:沿著 GC Root 對(duì)象的引用鏈找,直接或間接引用到的對(duì)象加上標(biāo)記。
清除階段:釋放未加標(biāo)記的對(duì)象占用的內(nèi)存。
GC 的目的在于實(shí)現(xiàn)無(wú)用對(duì)象內(nèi)存自動(dòng)釋放,減少內(nèi)存碎片、加快分配速度。
GC 要點(diǎn):
回收區(qū)域是堆內(nèi)存,不包括虛擬機(jī)棧,判斷無(wú)用對(duì)象,使用可達(dá)性分析算法,三色標(biāo)記法標(biāo)記存活對(duì)象,回收未標(biāo)記對(duì)象。GC具體的實(shí)現(xiàn)稱(chēng)為垃圾回收器,GC大都采用了分代回收思想。
理論依據(jù)是大部分對(duì)象朝生夕滅,用完立刻就可以回收,另有少部分對(duì)象會(huì)長(zhǎng)時(shí)間存活,每次很難回收根據(jù)這兩類(lèi)對(duì)象的特性將回收區(qū)域分為新生代和老年代,新生代采用標(biāo)記復(fù)制法、老年代一般采用標(biāo)記整理法
根據(jù) GC 的規(guī)??梢苑殖?Minor GC,Mixed GC,F(xiàn)ull GC
(1)分代回收
伊甸園 eden,最初對(duì)象都分配到這里,與幸存區(qū) survivor(分成 from 和 to)合稱(chēng)新生代,
當(dāng)伊甸園的內(nèi)存不足,標(biāo)記伊甸園與from(現(xiàn)階段沒(méi)有)的存活對(duì)象。
將存活對(duì)象采用復(fù)制算法復(fù)制到to中,復(fù)制完畢后,伊甸園和from內(nèi)存都得到釋放。
將存活對(duì)象采用復(fù)制算法復(fù)制到to中
復(fù)制完畢后,伊甸園和from內(nèi)存都得到釋放
老年代old,當(dāng)幸存區(qū)對(duì)象熬過(guò)幾次回收(最多15次),晉升到老年代(幸存區(qū)內(nèi)存不足或大對(duì)象會(huì)導(dǎo)致提前晉升)
GC規(guī)換
·Minor GC發(fā)生在新生代的垃圾回收,暫停時(shí)間短
·Mixed GC新生代+老年代部分區(qū)域的垃圾回收,G1收集器特有
·Full GC新生代+老年代完整垃圾回收,暫停時(shí)間長(zhǎng),應(yīng)盡力避免
三色標(biāo)記
即用三種顏色記錄對(duì)象的標(biāo)記狀態(tài):黑色-已標(biāo)記,灰色-標(biāo)記中,白色-還未標(biāo)記,起始的三個(gè)對(duì)象還未處理完成,用灰色表示。
依次類(lèi)推
沿著引用鏈都標(biāo)記了一遍
最后為標(biāo)記的白色對(duì)象,即為垃圾
并發(fā)漏標(biāo)問(wèn)題
比較先進(jìn)的垃圾回收器都支持并發(fā)標(biāo)記,即在標(biāo)記過(guò)程中,用戶(hù)線程仍然能工作。但這祥帶來(lái)一個(gè)新的問(wèn)題,如果用戶(hù)線程修改了對(duì)象引用,那么就存在漏標(biāo)問(wèn)題。例如:
如圖所示標(biāo)記工作尚未完成
用戶(hù)線程同時(shí)在工作,斷開(kāi)了第一層3、4兩個(gè)對(duì)象之間的引用,這時(shí)對(duì)于正在處理3號(hào)對(duì)象的垃圾回收線程來(lái)講,它會(huì)將4號(hào)對(duì)象當(dāng)做是白色垃圾。
但如果其他用戶(hù)線程又建立了2、4兩個(gè)對(duì)象的引用,這時(shí)因?yàn)?號(hào)對(duì)象是黑色已處理對(duì)象了,因此垃圾回收線程不會(huì)察覺(jué)到這個(gè)引用關(guān)系的變化,從而產(chǎn)生了漏標(biāo)。
如果用戶(hù)線程讓黑色對(duì)象引用了一個(gè)新增對(duì)象,一樣會(huì)存在漏標(biāo)問(wèn)題。
因此對(duì)于并發(fā)標(biāo)記而言,必須解決漏標(biāo)問(wèn)題,也就是要記錄標(biāo)記過(guò)程中的變化。有兩種解決方法:
Incremental Update 增量更新法,CMS垃圾回收器采用。思路是攔截每次賦值動(dòng)作,只要賦值發(fā)生,被賦值的對(duì)象就會(huì)被記錄下來(lái),在重新標(biāo)記階段再確認(rèn)一遍
Snapshot At The Beginning,SATB原始快照法,G1垃圾回收器采用思路也是攔截每次賦值動(dòng)作,不過(guò)記錄的對(duì)象不同,也需要在重新標(biāo)記階段對(duì)這些對(duì)象二次處理,新加對(duì)象會(huì)被記錄,被刪除引用關(guān)系的對(duì)象也被記錄
垃圾回收器-Parallel Gc
·eden內(nèi)存不足發(fā)生Minor GC,采用標(biāo)記復(fù)制算法,需要暫停用戶(hù)線程
·old內(nèi)存不足發(fā)生Full GC,采用標(biāo)記整理算法,需要暫停用戶(hù)線程
·注重吞吐量
垃圾回收器·ConcurrentMarkSweep Gc
·它是工作在old老年代,支持并發(fā)標(biāo)記的一款回收器,采用并發(fā)清除算法
。并發(fā)標(biāo)記時(shí)不需暫停用戶(hù)線程
。重新標(biāo)記時(shí)仍需暫停用戶(hù)線程
·如果并發(fā)失敗(即回收速度趕不上創(chuàng)建新對(duì)象速度),會(huì)觸發(fā)FullGC
·注重響應(yīng)時(shí)間
垃圾回收器-G1GC
·響應(yīng)時(shí)間與吞吐量兼顧
·劃分成多個(gè)區(qū)域,每個(gè)區(qū)域都可以充當(dāng)eden,survivor,old,humongous,其中humongous專(zhuān)為大對(duì)象準(zhǔn)備
·分成三個(gè)階段:新生代回收、并發(fā)標(biāo)記、混合收集
·如果并發(fā)失敗(即回收速度趕不上創(chuàng)建新對(duì)象速度),會(huì)觸發(fā)FulGC
G1回收階段·新生代回收
1.初始時(shí),所有區(qū)域都處于空閑狀態(tài)
創(chuàng)建了一些對(duì)象,挑出一些空閑區(qū)域作為伊甸園區(qū)存儲(chǔ)這些對(duì)象
當(dāng)伊甸園需要垃圾回收時(shí),挑出一個(gè)空閑區(qū)域作為幸存區(qū),用復(fù)制算法復(fù)制存活對(duì)象,需要暫停用戶(hù)線程。
復(fù)制完成,將之前的伊甸園內(nèi)存釋放。
將伊甸園以及之前幸存區(qū)中的存活對(duì)象,采用復(fù)制算法,復(fù)制到新的幸存區(qū),其中較老對(duì)象晉升至老年代。
釋放伊甸園以及之前幸存區(qū)的內(nèi)存。
G1回收階段·并發(fā)標(biāo)記與混合收集
1.當(dāng)老年代占用內(nèi)存超過(guò)閾值后,觸發(fā)并發(fā)標(biāo)記,這時(shí)無(wú)需暫停用戶(hù)線程。
并發(fā)標(biāo)記之后,會(huì)有重新標(biāo)記階段解決漏標(biāo)問(wèn)題,此時(shí)需要暫停用戶(hù)線程。這些都完成后就知道了老年代有哪些存活對(duì)象,隨后進(jìn)入混合收集階段。此時(shí)不會(huì)對(duì)所有老年代區(qū)域進(jìn)行回收,而是根據(jù)暫停時(shí)間目標(biāo)優(yōu)先回收價(jià)值高(存活對(duì)象少)的區(qū)域(這也是Gabage First名稱(chēng)的由來(lái))。
混合收集階段中,參與復(fù)制的有eden、survivor、old,下圖顯示了伊甸園和幸存區(qū)的存活對(duì)象復(fù)制。
下圖顯示了老年代和幸存區(qū)晉升的存活對(duì)象的復(fù)制。
復(fù)制完成,內(nèi)存得到釋放。進(jìn)入下一輪的新生代回收、并發(fā)標(biāo)記、混合收集。