Android 內(nèi)存回收機(jī)制

對(duì)于 Android 設(shè)備來說,我們每打開一個(gè) APP,它的內(nèi)存都是彈性分配的,并且其分配值與最大值是受具體設(shè)備而定的。
此外,我們需要注意區(qū)分如下兩種 OOM 場(chǎng)景:

  • 1)、內(nèi)存真正不足:例如 APP 當(dāng)前進(jìn)程最大內(nèi)存上限為 512 MB,當(dāng)超過這個(gè)值就表明內(nèi)存真正不足了。
  • 2)、可用內(nèi)存不足:手機(jī)系統(tǒng)內(nèi)存極度緊張,就算 APP 當(dāng)前進(jìn)程最大內(nèi)存上限為 512 MB,我們只分配了 200 MB,也會(huì)產(chǎn)生內(nèi)存溢出,因?yàn)橄到y(tǒng)的可用內(nèi)存不足了。

在Android的高級(jí)系統(tǒng)版本中,針對(duì)Heap空間有一個(gè)Generational Heap Memory的模型,其中將整個(gè)內(nèi)存分為三個(gè)區(qū)域:

  • Young Generation(年輕代)
  • Old Generation(年老代)
  • Permanent Generation(持久代)

1、Young Generation

由一個(gè)Eden區(qū)和兩個(gè)Survivor區(qū)組成,程序中生成的大部分新的對(duì)象都在Eden區(qū)中,當(dāng)Eden區(qū)滿時(shí),還存活的對(duì)象將被復(fù)制到其中一個(gè)Survivor區(qū),當(dāng)此Survivor區(qū)滿時(shí),此區(qū)存活的對(duì)象又被復(fù)制到另一個(gè)Survivor區(qū),當(dāng)這個(gè)Survivor區(qū)也滿時(shí),會(huì)將其中存活的對(duì)象復(fù)制到年老代。

2、Old Generation

一般情況下,年老代中的對(duì)象生命周期都比較長(zhǎng)。

3、Permanent Generation

用于存放靜態(tài)的類和方法,持久代對(duì)垃圾回收沒有顯著影響。(在 JDK 1.8 及之后的版本,在本地內(nèi)存中實(shí)現(xiàn)的元空間(Meta-space)已經(jīng)代替了永久代)

4、內(nèi)存對(duì)象的處理過程小結(jié)

  • 1、對(duì)象創(chuàng)建后在Eden區(qū)。
  • 2、執(zhí)行GC后,如果對(duì)象仍然存活,則復(fù)制到S0區(qū)。
  • 3、當(dāng)S0區(qū)滿時(shí),該區(qū)域存活對(duì)象將復(fù)制到S1區(qū),然后S0清空,接下來S0和S1角色互換。
  • 4、當(dāng)?shù)?步達(dá)到一定次數(shù)(系統(tǒng)版本不同會(huì)有差異)后,存活對(duì)象將被復(fù)制到Old Generation。
  • 5、當(dāng)這個(gè)對(duì)象在Old Generation區(qū)域停留的時(shí)間達(dá)到一定程度時(shí),它會(huì)被移動(dòng)到Old Generation,最后累積一定時(shí)間再移動(dòng)到Permanent Generation區(qū)域。

系統(tǒng)在Young Generation、Old Generation上采用不同的回收機(jī)制。每一個(gè)Generation的內(nèi)存區(qū)域都有固定的大小。隨著新的對(duì)象陸續(xù)被分配到此區(qū)域,當(dāng)對(duì)象總的大小臨近這一級(jí)別內(nèi)存區(qū)域的閾值時(shí),會(huì)觸發(fā)GC操作,以便騰出空間來存放其他新的對(duì)象。

此外,執(zhí)行GC占用的時(shí)間與Generation和Generation中的對(duì)象數(shù)量有關(guān),如下所示:

  • Young Generation < Old Generation < Permanent Generation
  • Generation中的對(duì)象數(shù)量與執(zhí)行時(shí)間成反比。

5、Young Generation GC

由于其對(duì)象存活時(shí)間短,因此基于Copying算法(掃描出存活的對(duì)象,并復(fù)制到一塊新的完全未使用的控件中)來回收。新生代采用空閑指針的方式來控制GC觸發(fā),指針保持最后一個(gè)分配的對(duì)象在Young Generation區(qū)間的位置,當(dāng)有新的對(duì)象要分配內(nèi)存時(shí),用于檢查空間是否足夠,不夠就觸發(fā)GC。

6、Old Generation GC

由于其對(duì)象存活時(shí)間較長(zhǎng),比較穩(wěn)定,因此采用Mark(標(biāo)記)算法(掃描出存活的對(duì)象,然后再回收未被標(biāo)記的對(duì)象,回收后對(duì)空出的空間要么合并,要么標(biāo)記出來便于下次分配,以減少內(nèi)存碎片帶來的效率損耗)來回收。

7、Dalvik 與 ART 區(qū)別

  • 1)、Dalivk 僅固定一種回收算法。
  • 2)、ART 回收算法可運(yùn)行期選擇。
  • 3)、ART 具備內(nèi)存整理能力,減少內(nèi)存空洞。

參考

Android性能優(yōu)化之內(nèi)存優(yōu)化

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

相關(guān)閱讀更多精彩內(nèi)容

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