常見的垃圾回收算法
1娜庇、引用算法(Reference Counting)
在對象頭處維護一個counter再登,每增加一次對該對象的引用計數(shù)器自加,如果對該對象的引用失聯(lián)付秕,則計數(shù)器自減兰珍。當counter為0時,表明該對象已經(jīng)被廢棄询吴,不處于存活狀態(tài)掠河。這種方式一方面無法區(qū)分軟、虛猛计、弱唠摹、強引用類別。另一方面奉瘤,會造成死鎖勾拉,假設(shè)兩個對象相互引用始終無法釋放counter盗温,永遠不能GC藕赞。此算法最致命的是無法處理循環(huán)引用的問題卖局。
2、復制算法(Copying)
將原有的內(nèi)存空間分為兩塊吼驶,每次只使用其中的一塊惩激,在垃圾回收時候,將正在使用的內(nèi)存中的存活對象復制到為未使用的內(nèi)存中蟹演,清除正在使用的內(nèi)存塊中的所有對象,交換兩個內(nèi)存的角色酒请,完成垃圾回收。此算法每次只處理正在使用中的對象,因此復制成本較小布朦,同時復制過去以后還能進行相應(yīng)的內(nèi)存整理囤萤,不會出現(xiàn) “ 碎片 ” 問題。當然是趴,此算法的缺點也是很明顯的涛舍,就是需要兩倍內(nèi)存空間。
GC前后對比圖
標記 - 清除 (Mark - Sweep)
此算法執(zhí)行分兩階段富雅。第一階段從引用根節(jié)點開始標記所有被引用的對象肛搬,第二階段便利整個堆,把未標記的對象清除温赔。此算法需要暫停整個應(yīng)用,同時陶贼,會產(chǎn)生內(nèi)存碎片。
標記 - 清除
標記 - 整理(Mark - Compact)
此算法結(jié)合了 “標記 - 清除” 和 “復制” 兩個算法的優(yōu)點骇窍。也是分為兩階段,第一階段從根節(jié)點開始標記所有被引用對象腹纳,第二階段便利整個堆,把清除未標記對象并且把存活對象 “壓縮” 到堆的其中一塊嘲恍,按順序排放足画。此算法避免了 “標記 - 清除” 的碎片問題佃牛, 同時也避免了 “復制” 算法的空間問題。
標記 - 整理