Android 性能優(yōu)化-GC確定回收的算法

本文中分享兩種GC確定回收的算法


引用計數(shù)算法以及可達(dá)性分析算法

引用計數(shù)算法:簡單來說引用計數(shù)算法就是當(dāng)前內(nèi)存地址存在多少個對象引用了這一塊地址,使用一個標(biāo)識來記錄引用的個數(shù),如果引用大于0則標(biāo)識當(dāng)前內(nèi)存地址被其他的對象引用著,那么GC將不會做回收處理,反之GC將會認(rèn)為該引用可以被回收。

這里舉個例子說明:

//new出一個新的Object對象
Object o1 = new Object();

因為新new出來的對象會指向?qū)ο蟮囊玫刂?那么o1會持有這個引用,所以新的對象引用的引用數(shù)是1。

//將o1的引用斷開
o1 = null ;

將o1設(shè)置成null時,引用地址與o1引用鏈接被斷開,所以引用地址的引用數(shù)從1 -> 0,當(dāng)引用數(shù)量為0,那么引用地址會被GC認(rèn)定為垃圾將被回收。

但是引用計數(shù)算法存在缺點(diǎn),當(dāng)對象互相引用容易出現(xiàn)計算器永不為0

舉個例子來說明

//new出一個新的Object對象
Object o1 = new Object();

此時的引用地址只被o1引用所以引用數(shù)為1

//創(chuàng)建一個對象o2
Object o2 ;
//將o1的引用地址賦值給o2
o2 = o1 ;

此時o2再次引用了o1的引用地址,所以醫(yī)用地址做+1操作,所以當(dāng)前的引用地址數(shù)量從1變?yōu)?

//將o1的引用斷開
o1 = null ;

當(dāng)前o1與引用地址鏈接被斷開,引用地址的引用數(shù)量從2變?yōu)?,因為創(chuàng)建出來的引用地址仍然被o2引用,所以引用地址無法被GC認(rèn)定為可以回收的垃圾內(nèi)存,當(dāng)這種現(xiàn)象不斷發(fā)生卻沒有做處理的時候,這樣就會引發(fā)OOM。


可達(dá)性分析算法:算法的基本思路就是從一個起點(diǎn)(GC Root)樹形結(jié)構(gòu)的往下面走,判斷每一個節(jié)點(diǎn)是否還持有引用鏈,倘若引用鏈仍然被持有那么對象將不會被GC回收,如果引用鏈斷開也就是說在樹形結(jié)構(gòu)往下查找判斷時檢測引用鏈斷開了,那么GC將會可以回收對象。

可達(dá)性分析算法簡單示意圖.png

可達(dá)性分析算法簡單示意圖中可以看到,從GC Root作為起點(diǎn)并與ObJA等對象(也就是圖中藍(lán)色背景部分)持有引用鏈,但是圖中的ObJD、ObJE、ObJF(也就是圖中的黃色背景部分)是不在存在引用鏈的,也就是說在已GC Root為起點(diǎn)在檢索過程中會發(fā)現(xiàn)這些對象不持有引用鏈那么這些對象將會面臨被回收的可能。

在Java中可以作為GC Root的對象有以下幾種

  • 虛擬機(jī)棧運(yùn)行時中的引用
  • 常量
  • 靜態(tài)屬性
  • JNI引用對象

為什么說是會面臨被回收的可能?

因為在GC回收掃描時需要經(jīng)過兩次掃描才會回收對象,第一次GC回收掃描時發(fā)現(xiàn)對象可以被回收,GC會對對象做一次標(biāo)記操作,等到GC第二次被回收時對象才會被回收,所以可以在第一次標(biāo)記到回收期間做操作將對象重新添加到引用鏈上,通過Object中的finalize()方法實(shí)現(xiàn)該動作,以下舉個例子說明。

static App a;

@Override
protected void finalize() throws Throwable{
    super.finalize();
    //將對象a重新添加引用鏈
    a=this;
}

以上當(dāng)對象被GC標(biāo)記為要回收的對象后,可以通過finalize()內(nèi)部再次將對象添加到引用鏈上,所以這樣就實(shí)現(xiàn)了對象被標(biāo)記為回收后重新被拉活。


下一篇 了解下四種引用類型同時了解下不同引用類型與GC回收的關(guān)系
Android 性能優(yōu)化-內(nèi)存篇(3) - 簡書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容