Android內(nèi)存管理機(jī)制

Android內(nèi)存管理機(jī)制的定義

  • 內(nèi)存的分配
  • 內(nèi)存的回收

管理機(jī)制的說明

管理的內(nèi)存對象

  • 進(jìn)程
  • 對象
  • 變量

管理的角色

Android 系用可分為三個層次分別為:Application Framework、Dalvik、Linux內(nèi)核

負(fù)責(zé)管理進(jìn)程內(nèi)存
  • Application Framework
  • Linux
負(fù)責(zé)管理對象、變量內(nèi)存
  • Dalvik虛擬機(jī)

內(nèi)存管理的詳細(xì)分析

進(jìn)程內(nèi)存管理

內(nèi)存的分配策略
  • 由ActivityMangerService集中管理所有進(jìn)程的內(nèi)存分配
內(nèi)存的回收策略
  1. Application Framework 決定回收的進(jìn)程類型

    當(dāng)進(jìn)程的內(nèi)存空間緊張的時候,會按照進(jìn)程的優(yōu)先級從低到高的順序依次自動去做回收

    前臺進(jìn)程 (最高)

    可見進(jìn)程

    服務(wù)進(jìn)程

    后臺進(jìn)程

    空進(jìn)程(最低)

  2. Linux內(nèi)核做進(jìn)程的回收

    • ActivityManagerService對所有進(jìn)程做評分
    • 將分?jǐn)?shù)更新到Linux內(nèi)核中
    • 由Linux內(nèi)核完成真正的回收

對象、變量的內(nèi)存管理

  • Android對于對象、變量的內(nèi)存管理策略同于Java。
  • 內(nèi)存管理 == 對象、變量的內(nèi)存分配和內(nèi)存的釋放。
內(nèi)存分配策略
  • Android中對象、變量的內(nèi)存分配由程序自動完成。

  • 三種分配

    1. 靜態(tài)分配:面向靜態(tài)變量

    2. 棧式分配:面向局部變量

    3. 堆式分配:面向?qū)ο髮嵗?/p>

    4. 具體描述如下

    內(nèi)存分配策略 使用的內(nèi)存空間 存儲的數(shù)據(jù) 分配策略描述
    靜態(tài)分配 方法區(qū)<br />(靜態(tài)存儲區(qū)) 存儲已經(jīng)被虛擬機(jī)加載的類信息,常量和靜態(tài)變量 在程序編譯時就已經(jīng)分配好以及存在于整個運(yùn)行期間<br />(不需要回收)
    棧式分配 棧區(qū) 存儲方法執(zhí)行時的局部變量(含數(shù)據(jù)類型、對象引用)<br />(已幀棧的形式) 1. 方法執(zhí)行時,定義的局部變量由程序自動在棧中分配內(nèi)存<br />2. 方法只是結(jié)束后/超出變量域時,由棧幀自動釋放該部分的內(nèi)存<br />3. 效率高(棧內(nèi)存分配運(yùn)算置于處理器的指令中)<br />4. 分配的內(nèi)存容量有限
    堆式分配 堆區(qū) 存儲Java對象的實例以及對象內(nèi)部的成員變量<br />1. 采用關(guān)鍵字 new出來的對象<br />2. 實例的成員變量= 基本數(shù)據(jù)類型、引用以及引用的對象實體 1. 創(chuàng)建對象實例時,由程序分配<br />(由Java垃圾回收管理器自動管理;不使用時則回收)<br />訪問方式<br />1. 創(chuàng)建一個對象,在堆內(nèi)存中存放首地址在棧內(nèi)存中定一個飲用變量;<br />2. 通過引用變量來訪問堆內(nèi)存中的對象/數(shù)組
    1. 代碼實例講解
    public class MemoryManageClass {
    
        int s1 = 0;
    
        MemoryManageClass mClass1 = new MemoryManageClass();
    
        public void method(){
            //變量s2、mClass2 都存放在棧內(nèi)存中
            int s2 = 0;
            //變量mClass2 所指向的對象實例存在堆內(nèi)存中
            //該對象的實例中的成員變量 s1和mClass1 也放在堆中
            MemoryManageClass mClass2 = new MemoryManageClass();
        }
    
    }
    
    
    // mClass 變量存放在棧中,mClass變量指向的對象實例存放在堆中
    //該對象實例中的成員變量 s1 mClass1 存放在堆中
    MemoryManageClass mClass = new MemoryManageClass();
    
內(nèi)存釋放策略
  • 變量/對象的內(nèi)存釋放右Java的GC/棧幀負(fù)責(zé)回收
  • 靜態(tài)分配不需要釋放,棧式分配由棧幀自動出、入棧。
  • 堆式分配的內(nèi)存釋放原則 == Java的垃圾回收器(GC)
  • Java垃圾回收器的內(nèi)存釋放 主要有垃圾回收算法來完成
垃圾回收算法
  • 標(biāo)記-清除 算法
  • 復(fù)制 算法
  • 標(biāo)記-整理 算法
  • 分代收集 算法

具體算法介紹

算法名稱 算法思想 優(yōu)點 缺點 應(yīng)用場景
標(biāo)記-清除 1. 標(biāo)記階段:標(biāo)記出所有需要回收的對象<br />2. 清除階段:統(tǒng)一清除(回收,釋放)所有被標(biāo)記的對象 實現(xiàn)簡單 1. 效率問題:標(biāo)記和清除階段效率不高<br />2. 空間問題:標(biāo)記 清除后,會產(chǎn)生大量不連續(xù)的內(nèi)存碎片 對象存活率低一級垃圾回收行為頻率低
復(fù)制 1. 將內(nèi)存分為大小相等的兩塊,每次使用其中一塊<br />2. 當(dāng)使用的這塊內(nèi)存用完,就將這塊內(nèi)存上還存活的對象復(fù)制到另一塊還沒使用的內(nèi)存上<br />3. 最終將使用那塊內(nèi)存一次清除掉。 1. 解決了算法1中的清除效率低的問題;每次僅僅回收內(nèi)存的一半?yún)^(qū)域<br />2. 解決了算法1中 因清除而產(chǎn)生的不連續(xù)內(nèi)存碎片的問題;將已經(jīng)使用內(nèi)存上的存活對象移動到棧頂?shù)闹羔?,按順序分配?nèi)存即可。 1. 每次使用的內(nèi)存縮小為原來的一半<br />2. 當(dāng)對象存活率較高的情況下需要做很多復(fù)制操作,效率會變低。 對象存活率較低 以及需要頻繁進(jìn)行垃圾回收的區(qū)域
標(biāo)記-整理 1. 標(biāo)記階段:標(biāo)記出所有需要回收的對象<br />2. 整理階段:讓所有存活的對象都向一端移動<br />3. 清除階段:統(tǒng)一清除端以外的對象 1. 解決了算法1中清除效率低的問題,一次性清除端以外區(qū)域的對象<br />2. 解決了算法1中 空間中產(chǎn)生不連續(xù)內(nèi)存碎片的問題。 步驟繁多:標(biāo)記 整理 清除 對象存活率較低 一級 垃圾回收行為頻率低的
分代收集 1. 根據(jù)對象存活周期的不同將Java堆內(nèi)存分為:新生代和老年代<br />2. 每塊區(qū)域的特點如下<br />新生代: 對象存活率較低 以及 垃圾回收行為頻率較高<br />老生代:對象存活率較低 以及 垃圾回收行為頻率低<br />3. 根據(jù)每塊區(qū)域的選擇對應(yīng)的算法<br />新生代:復(fù)制算法<br />老生代:標(biāo)記-清除 標(biāo)記-整理 效率高,空間利用率高;根據(jù)不用區(qū)域特點選擇不同垃圾收集算法 主流的虛擬機(jī)基本都使用該算法

參考

https://mp.weixin.qq.com/s/VSy7Wf-AZMKiaGB7dSR_Cg

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

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

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