GC 算法與種類
■ GC的概念
■ GC算法
????? 引用計(jì)數(shù)法
????? 標(biāo)記清除
????? 標(biāo)記壓縮
????? 復(fù)制算法
■?可觸及性
■ Stop-The-World
GC的概念
■ Garbage Collection 垃圾收集
■?1960年 List 使用了GC
■?Java中,GC的對象是堆空間和永久區(qū)
引用計(jì)數(shù)法
■?老牌垃圾回收算法
■ 通過引用計(jì)算來回收垃圾
■?使用者
? ????COM
? ????ActionScript3
????? Python
■?引用計(jì)數(shù)器的實(shí)現(xiàn)很簡單,對于一個對象A,只要有任何一個對象引用了A,則A的引用計(jì)數(shù)器就加1,當(dāng)引用失效時(shí),引用計(jì)數(shù)器就減1。只要對象A的引用計(jì)數(shù)器的值為0,則對象A就不可能再被使用。
■?引用計(jì)數(shù)法的問題
? ????引用和去引用伴隨加法和減法,影響性能
? ????很難處理循環(huán)引用
標(biāo)記 - 清除
■ 標(biāo)記-清除算法是現(xiàn)代垃圾回收算法的思想基礎(chǔ)。標(biāo)記-清除算法將垃圾回收分為兩個階段:標(biāo)記階段和清除階段。一種可行的實(shí)現(xiàn)是,在標(biāo)記階段,首先通過根節(jié)點(diǎn),標(biāo)記所有從根節(jié)點(diǎn)開始的可達(dá)對象。因此,未被標(biāo)記的對象就是未被引用的垃圾對象。然后,在清除階段,清除所有未被標(biāo)記的對象。
標(biāo)記 - 壓縮
■ 標(biāo)記-壓縮算法適合用于存活對象較多的場合,如老年代。它在標(biāo)記-清除算法的基礎(chǔ)上做了一些優(yōu)化。和標(biāo)記-清除算法一樣,標(biāo)記-壓縮算法也首先需要從根節(jié)點(diǎn)開始,對所有可達(dá)對象做一次標(biāo)記。但之后,它并不簡單的清理未標(biāo)記的對象,而是將所有的存活對象壓縮到內(nèi)存的一端。之后,清理邊界外所有的空間。
復(fù)制算法
■ 與標(biāo)記-清除算法相比,復(fù)制算法是一種相對高效的回收方法
■ 不適用于存活對象較多的場合 如老年代
■ 將原有的內(nèi)存空間分為兩塊,每次只使用其中一塊,在垃圾回收時(shí),將正在使用的內(nèi)存中的存活對象復(fù)制到未使用的內(nèi)存塊中,之后,清除正在使用的內(nèi)存塊中的所有對象,交換兩個內(nèi)存的角色,完成垃圾回收
分代思想
■ 依據(jù)對象的存活周期進(jìn)行分類,短命對象歸為新生代,長命對象歸為老年代。
■ 根據(jù)不同代的特點(diǎn),選取合適的收集算法?????
? ????少量對象存活,適合復(fù)制算法
? ????大量對象存活,適合標(biāo)記清理或者標(biāo)記壓縮
GC算法總結(jié)整理
■?引用計(jì)數(shù)
? ?? ??沒有被Java采用
■ 標(biāo)記-清除
■?標(biāo)記-壓縮
■?復(fù)制算法
? ?? ? 新生代
可觸及性
■?可觸及的
? ????從根節(jié)點(diǎn)可以觸及到這個對象
■?可復(fù)合的
? ????一旦所有引用被釋放,就是可復(fù)活狀態(tài)
? ????因?yàn)樵趂inalize()中可能復(fù)活該對象
■?不可觸及的????
? ????在finalize()后,可能會進(jìn)入不可觸及狀態(tài)
??????不可觸及的對象不可能復(fù)活
??????可以回收
■?經(jīng)驗(yàn):避免使用finalize(),操作不慎可能導(dǎo)致錯誤
■?優(yōu)先級低,何時(shí)被調(diào)用, 不確定????
? ????何時(shí)發(fā)生GC不確定
■?可以使用try-catch-finally來替代它
■ 根
? ??? 棧中引用的對象
??????方法區(qū)中靜態(tài)成員或者常量引用的對象(全局對象)
??????JNI方法棧中引用對象
Stop-The-World
■ Stop-The-World
? ????棧中引用的對象
??????全局停頓,所有Java代碼停止,native代碼可以執(zhí)行,但不能和JVM交互
??????多半由于GC引起:Dump線程,死鎖檢查,堆Dump
■ GC時(shí)為什么會有全局停頓?
????? 類比在聚會時(shí)打掃房間,聚會時(shí)很亂,又有新的垃圾產(chǎn)生,房間永遠(yuǎn)打掃不干凈,只有讓大家停止活動了,才能將房間打掃干凈
■ 危害
????? 長時(shí)間服務(wù)停止,沒有響應(yīng)
????? 遇到HA系統(tǒng),可能引起主備切換,嚴(yán)重危害生產(chǎn)環(huán)境