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