Android OOM之內(nèi)存泄漏詳解

OOM(OutOfMemory)就是我們平時(shí)所碰到的內(nèi)存溢出,而內(nèi)存泄漏的最終后果就是導(dǎo)致OOM吻贿。
內(nèi)存泄漏是造成應(yīng)用程序OOM的主要原因之一臣咖!我們知道Android系統(tǒng)為每個(gè)應(yīng)用程序分配的內(nèi)存有限跨琳,而當(dāng)一個(gè)應(yīng)用中產(chǎn)生的內(nèi)存泄漏比較多時(shí)近顷,這就難免會(huì)導(dǎo)致應(yīng)用所需要的內(nèi)存超過(guò)這個(gè)系統(tǒng)分配的內(nèi)存限額诈唬,這就造成了內(nèi)存溢出而導(dǎo)致應(yīng)用Crash韩脏。

一、內(nèi)存分配策略

程序運(yùn)行時(shí)的內(nèi)存分配有三種策略,分別是靜態(tài)的,棧式的,和堆式的铸磅,對(duì)應(yīng)的赡矢,三種存儲(chǔ)策略使用的內(nèi)存空間主要分別是靜態(tài)存儲(chǔ)區(qū)(也稱方法區(qū))、堆區(qū)和棧區(qū)阅仔。他們的功能不同吹散,對(duì)他們使用方式也就不同。

  • 靜態(tài)存儲(chǔ)區(qū)(方法區(qū)):內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好八酒,這塊內(nèi)存在程序整個(gè)運(yùn)行期間都存在空民。
    它主要存放靜態(tài)數(shù)據(jù)、全局static數(shù)據(jù)和常量羞迷。
  • 棧區(qū):在執(zhí)行函數(shù)時(shí)界轩,函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放衔瓮。
    棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中浊猾,效率很高,但是分配的內(nèi)存容量有限热鞍。
  • 堆區(qū):亦稱動(dòng)態(tài)內(nèi)存分配与殃。
    程序在運(yùn)行的時(shí)候用malloc或new申請(qǐng)任意大小的內(nèi)存,程序員自己負(fù)責(zé)在適當(dāng)?shù)臅r(shí)候用free或delete釋放內(nèi)存(Java則依賴?yán)厥掌鳎┌帧?dòng)態(tài)內(nèi)存的生存期可以由我們決定幅疼,如果我們不釋放內(nèi)存,程序?qū)⒃谧詈蟛裴尫诺魟?dòng)態(tài)內(nèi)存昼接。 但是爽篷,良好的編程習(xí)慣是:如果某動(dòng)態(tài)內(nèi)存不再使用,需要將其釋放掉慢睡。

堆和棧的區(qū)別:

  1. 棧內(nèi)存
    在函數(shù)中(說(shuō)明是局部變量)定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配逐工。當(dāng)在一段代碼塊中定義一個(gè)變量時(shí),java就在棧中為這個(gè)變量分配內(nèi)存空間漂辐,當(dāng)超過(guò)變量的作用域后泪喊,java會(huì)自動(dòng)釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立刻被另作他用髓涯。
  2. 堆內(nèi)存
    堆內(nèi)存用于存放所有由new創(chuàng)建的對(duì)象(內(nèi)容包括該對(duì)象其中的所有成員變量)和數(shù)組袒啼。在堆中分配的內(nèi)存,由java虛擬機(jī)自動(dòng)垃圾回收器來(lái)管理。在堆中產(chǎn)生了一個(gè)數(shù)組或者對(duì)象后蚓再,還可以在棧中定義一個(gè)特殊的變量滑肉,這個(gè)變量的取值等于數(shù)組或者對(duì)象在堆內(nèi)存中的首地址,在棧中的這個(gè)特殊的變量就變成了數(shù)組或者對(duì)象的引用變量摘仅,以后就可以在程序中使用棧內(nèi)存中的引用變量來(lái)訪問(wèn)堆中的數(shù)組或者對(duì)象靶庙,引用變量相當(dāng)于為數(shù)組或者對(duì)象起的一個(gè)別名,或者代號(hào)娃属。

堆是不連續(xù)的內(nèi)存區(qū)域(因?yàn)橄到y(tǒng)是用鏈表來(lái)存儲(chǔ)空閑內(nèi)存地址六荒,自然不是連續(xù)的),堆大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存(32bit系統(tǒng)理論上是4G)矾端,所以堆的空間比較靈活恬吕,比較大。
棧是一塊連續(xù)的內(nèi)存區(qū)域须床,大小是操作系統(tǒng)預(yù)定好的铐料,windows下棧大小是2M(也有是1M,在編譯時(shí)確定豺旬,VC中可設(shè)置)钠惩。

對(duì)于堆,頻繁的new/delete會(huì)造成大量?jī)?nèi)存碎片族阅,使程序效率降低篓跛。
對(duì)于棧,它是先進(jìn)后出的隊(duì)列坦刀,進(jìn)出一一對(duì)應(yīng)愧沟,不產(chǎn)生碎片,運(yùn)行效率穩(wěn)定高鲤遥。

結(jié)論:

  1. 局部變量的基本數(shù)據(jù)類型和引用存儲(chǔ)于棧中沐寺,引用的對(duì)象實(shí)體存儲(chǔ)于堆中。
    ——因?yàn)樗鼈儗儆诜椒ㄖ械淖兞扛悄危芷陔S方法而結(jié)束混坞。
  2. 成員變量全部存儲(chǔ)與堆中(包括基本數(shù)據(jù)類型,引用和引用的對(duì)象實(shí)體)钢坦。
    ——因?yàn)樗鼈儗儆陬惥吭校悓?duì)象終究是要被new出來(lái)使用的。

二爹凹、為什么會(huì)產(chǎn)生內(nèi)存泄漏厨诸?

這里所說(shuō)的內(nèi)存泄露只針對(duì)堆內(nèi)存,他們存放的就是引用指向的對(duì)象實(shí)體禾酱。為了判斷Java中是否有內(nèi)存泄露微酬,我們首先必須了解Java是如何管理(堆)內(nèi)存的绘趋。Java的內(nèi)存管理就是對(duì)象的分配和釋放問(wèn)題。在Java中得封,內(nèi)存的分配是由程序完成的,而內(nèi)存的釋放是由垃圾收集器(Garbage Collection指郁,GC)完成的忙上,程序員不需要通過(guò)調(diào)用函數(shù)來(lái)釋放內(nèi)存,但它只能回收無(wú)用并且不再被其它對(duì)象引用的那些對(duì)象所占用的空間闲坎。但當(dāng)一個(gè)對(duì)象已經(jīng)不需要再使用了疫粥,本該被回收時(shí),而有另外一個(gè)正在使用的對(duì)象持有它的引用從而導(dǎo)致它不能被回收腰懂,這導(dǎo)致本該被回收的對(duì)象不能被回收而停留在堆內(nèi)存中梗逮,這就產(chǎn)生了內(nèi)存泄漏。

三绣溜、Android中常見(jiàn)的導(dǎo)致內(nèi)存泄漏原因分析

  1. 單例模式
    不正確使用單例模式是引起內(nèi)存泄露的一個(gè)常見(jiàn)問(wèn)題慷彤,單例對(duì)象在被初始化后將在 JVM 的整個(gè)生命周期中存在(以靜態(tài)變量的方式),如果單例對(duì)象持有外部對(duì)象的引用怖喻,那么這個(gè)外部對(duì)象將不能被 JVM 正车谆回收,導(dǎo)致內(nèi)存泄露锚沸。
    可防止內(nèi)存泄漏示例如下:
public class AppManager {
    private volatile static AppManager instance;
    private Context context;
    private AppManager(Context context) {
        this.context = context;
    }
    public static AppManager getInstance(Context context) {
        if (instance != null) {
        synchronized (AppManager.class) {  
          if (instance == null) {  
              instance = new AppManager(context);
          }        
        }
        return instance;
    }
}

在上例中跋选,不管傳入什么Context最終將使用Application的Context,而單例的生命周期和應(yīng)用的一樣長(zhǎng)哗蜈,這樣就防止了內(nèi)存泄漏前标。

  1. 非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實(shí)例
    有的時(shí)候我們可能會(huì)在啟動(dòng)頻繁的Activity中,為了避免重復(fù)創(chuàng)建相同的數(shù)據(jù)資源距潘,可能會(huì)出現(xiàn)這種寫法:
public class MainActivity extends AppCompatActivity {
    private static TestResource mResource = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(mResource == null){
            mResource = new TestResource();
        }
        //...
    }
    class TestResource {
    //...
    }
}

這樣就在Activity內(nèi)部創(chuàng)建了一個(gè)非靜態(tài)內(nèi)部類的單例炼列,每次啟動(dòng)Activity時(shí)都會(huì)使用該單例的數(shù)據(jù),這樣雖然避免了資源的重復(fù)創(chuàng)建音比,不過(guò)這種寫法卻會(huì)造成內(nèi)存泄漏唯鸭,因?yàn)榉庆o態(tài)內(nèi)部類默認(rèn)會(huì)持有外部類的引用,而又使用了該非靜態(tài)內(nèi)部類創(chuàng)建了一個(gè)靜態(tài)的實(shí)例硅确,該實(shí)例的生命周期和應(yīng)用的一樣長(zhǎng)目溉,這就導(dǎo)致了該靜態(tài)實(shí)例一直會(huì)持有該Activity的引用,導(dǎo)致Activity的內(nèi)存資源不能正沉馀回收缭付。
正確的做法為:
將該內(nèi)部類設(shè)為靜態(tài)內(nèi)部類或?qū)⒃搩?nèi)部類抽取出來(lái)封裝成一個(gè)單例,如果需要使用Context循未,請(qǐng)使用ApplicationContext陷猫。

  1. Handler
    Handler的使用造成的內(nèi)存泄漏問(wèn)題應(yīng)該說(shuō)最為常見(jiàn)了秫舌,平時(shí)在處理網(wǎng)絡(luò)任務(wù)或者封裝一些請(qǐng)求回調(diào)等api都應(yīng)該會(huì)借助Handler來(lái)處理,對(duì)于Handler的使用代碼編寫一不規(guī)范即有可能造成內(nèi)存泄漏绣檬,要知道足陨,只要 Handler 發(fā)送的 Message 尚未被處理,則該 Message 及發(fā)送它的 Handler 對(duì)象將被線程 MessageQueue 一直持有娇未。由于 Handler 屬于 TLS(Thread Local Storage) 變量, 生命周期和 Activity 是不一致的墨缘。因此這種實(shí)現(xiàn)方式一般很難保證跟 View 或者 Activity 的生命周期保持一致,故很容易導(dǎo)致無(wú)法正確釋放零抬。
    示例如下:
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    //...
    }
};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loadData();
    }
    private void loadData(){
        //...request
        Message message = Message.obtain();
        mHandler.sendMessage(message);
    }
}

這種創(chuàng)建Handler的方式會(huì)造成內(nèi)存泄漏镊讼,由于mHandler是Handler的非靜態(tài)匿名內(nèi)部類的實(shí)例,所以它持有外部類Activity的強(qiáng)引用平夜,我們知道消息隊(duì)列是在一個(gè)Looper線程中不斷輪詢處理消息蝶棋,那么當(dāng)這個(gè)Activity退出時(shí)消息隊(duì)列中還有未處理的消息或者正在處理消息,而消息隊(duì)列中的Message持有mHandler實(shí)例的引用忽妒,mHandler又持有Activity的引用玩裙,所以導(dǎo)致該Activity的內(nèi)存資源無(wú)法及時(shí)回收,引發(fā)內(nèi)存泄漏段直∠仔铮可采用下面方式:

public class MainActivity extends AppCompatActivity {
    private MyHandler mHandler = new MyHandler(this);
    private TextView mTextView ;
    private static class MyHandler extends Handler {
        private WeakReference<context> reference;
        public MyHandler(Context context) {
        reference = new WeakReference<>(context);
        }
        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = (MainActivity) reference.get();
            if(activity != null){
            activity.mTextView.setText("");
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView)findViewById(R.id.textview);
        loadData();
    }

    private void loadData() {
        //...request
        Message message = Message.obtain();
        mHandler.sendMessage(message);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacksAndMessages(null);
    }
}

創(chuàng)建一個(gè)靜態(tài)Handler內(nèi)部類,然后對(duì)Handler持有的對(duì)象使用弱引用坷牛,這樣在回收時(shí)也可以回收Handler持有的對(duì)象罕偎,這樣雖然避免了Activity泄漏,不過(guò)Looper線程的消息隊(duì)列中還是可能會(huì)有待處理的消息京闰,所以我們?cè)贏ctivity的Destroy時(shí)或者Stop時(shí)應(yīng)該移除消息隊(duì)列中的消息,使用mHandler.removeCallbacksAndMessages(null);是移除消息隊(duì)列中所有消息和所有的Runnable颜及。當(dāng)然也可以使用mHandler.removeCallbacks();或mHandler.removeMessages();來(lái)移除指定的Runnable和Message。

  1. 線程內(nèi)存泄露
    線程也是造成內(nèi)存泄露的一個(gè)重要的源頭蹂楣。線程產(chǎn)生內(nèi)存泄露的主要原因在于線程生命周期的不可控俏站。比如線程是 Activity 的內(nèi)部類(匿名內(nèi)部類和非靜態(tài)內(nèi)部類持有外部類的強(qiáng)引用),則線程對(duì)象中保存了 Activity 的一個(gè)引用痊土,當(dāng)線程的 run 函數(shù)耗時(shí)較長(zhǎng)沒(méi)有結(jié)束時(shí)肄扎,線程對(duì)象是不會(huì)被銷毀的,因此它所引用的老的 Activity 內(nèi)存資源無(wú)法回收也不會(huì)被銷毀赁酝,因此就出現(xiàn)了內(nèi)存泄露的問(wèn)題犯祠。
    正確的做法還是使用靜態(tài)內(nèi)部類的方式。
  2. 資源未關(guān)閉
    對(duì)于使用了BraodcastReceiver酌呆,ContentObserver衡载,F(xiàn)ile,Cursor隙袁,Stream痰娱,Bitmap等資源的使用弃榨,應(yīng)該在Activity銷毀時(shí)及時(shí)關(guān)閉或者注銷,否則這些資源將不會(huì)被回收梨睁,造成內(nèi)存泄漏鲸睛。

總結(jié):

  1. 對(duì) Activity 等組件的引用應(yīng)該控制在 Activity 的生命周期之內(nèi); 如果不能控制就考慮使用 getApplicationContext 或者 getApplication坡贺,以避免 Activity 被外部比Activity生命周期長(zhǎng)的對(duì)象引用而泄露官辈。
  2. 盡量不要在靜態(tài)變量或者靜態(tài)內(nèi)部類中使用非靜態(tài)外部成員變量(包括context ),即使要使用拴念,也要考慮適當(dāng)時(shí)機(jī)把外部成員變量置空钧萍;也可以在內(nèi)部類中使用弱引用來(lái)引用外部類的變量來(lái)避免內(nèi)存泄漏褐缠。
  3. Handler 的持有的引用對(duì)象最好使用弱引用政鼠,資源釋放時(shí)也可以清空 Handler 里面的消息。比如在 Activity onStop 或者 onDestroy 的時(shí)候队魏,取消掉該 Handler 對(duì)象的 Message和 Runnable.
  4. 保持對(duì)對(duì)象生命周期的敏感公般,特別注意單例、靜態(tài)對(duì)象胡桨、全局性集合等的生命周期官帘。
  5. 線程 Runnable 執(zhí)行耗時(shí)操作,注意在頁(yè)面返回時(shí)及時(shí)取消或者把 Runnable 寫成靜態(tài)類昧谊。
    a) 如果線程類是內(nèi)部類刽虹,改為靜態(tài)內(nèi)部類。
    b) 線程內(nèi)如果需要引用外部類對(duì)象如 context呢诬,需要使用弱引用涌哲。
  6. 在 Java 的實(shí)現(xiàn)過(guò)程中,也要考慮其對(duì)象釋放尚镰,最好的方法是在不使用某對(duì)象時(shí)阀圾,顯式地將此對(duì)象賦空,如清空對(duì)圖片等資源有直接引用或者間接引用的數(shù)組(使用 array.clear() ; array = null)狗唉,最好遵循誰(shuí)創(chuàng)建誰(shuí)釋放的原則初烘。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市分俯,隨后出現(xiàn)的幾起案子肾筐,更是在濱河造成了極大的恐慌,老刑警劉巖缸剪,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件局齿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡橄登,警方通過(guò)查閱死者的電腦和手機(jī)抓歼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門讥此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谣妻,你說(shuō)我怎么就攤上這事萄喳。” “怎么了蹋半?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵他巨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我减江,道長(zhǎng)染突,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任辈灼,我火速辦了婚禮份企,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巡莹。我一直安慰自己司志,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布降宅。 她就那樣靜靜地躺著骂远,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腰根。 梳的紋絲不亂的頭發(fā)上激才,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音额嘿,去河邊找鬼瘸恼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岩睁,可吹牛的內(nèi)容都是我干的钞脂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捕儒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冰啃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起刘莹,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阎毅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玉锌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狼钮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碳柱。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熬芜,靈堂內(nèi)的尸體忽然破棺而出莲镣,到底是詐尸還是另有隱情,我是刑警寧澤涎拉,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布瑞侮,位于F島的核電站,受9級(jí)特大地震影響鼓拧,放射性物質(zhì)發(fā)生泄漏半火。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一季俩、第九天 我趴在偏房一處隱蔽的房頂上張望钮糖。 院中可真熱鬧,春花似錦种玛、人聲如沸藐鹤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至挠蛉,卻和暖如春祭示,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谴古。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工质涛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掰担。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓汇陆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親带饱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毡代,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們?cè)陂_(kāi)發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問(wèn)題。內(nèi)存泄漏...
    _痞子閱讀 1,637評(píng)論 0 8
  • 內(nèi)存管理的目的就是讓我們?cè)陂_(kāi)發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問(wèn)題勺疼。內(nèi)存泄漏大家都不陌生了教寂,簡(jiǎn)單粗俗的講,...
    宇宙只有巴掌大閱讀 2,363評(píng)論 0 12
  • 內(nèi)存管理的目的就是讓我們?cè)陂_(kāi)發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問(wèn)題执庐。內(nèi)存泄漏大家都不陌生了酪耕,簡(jiǎn)單粗俗的講,...
    DreamFish閱讀 791評(píng)論 0 5
  • 前言對(duì)于內(nèi)存泄漏轨淌,我想大家在開(kāi)發(fā)中肯定都遇到過(guò)迂烁,只不過(guò)內(nèi)存泄漏對(duì)我們來(lái)說(shuō)并不是可見(jiàn)的看尼,因?yàn)樗窃诙阎谢顒?dòng),而要想檢...
    大表哥007閱讀 244評(píng)論 0 1
  • 被文同時(shí)發(fā)布在CSDN上盟步,歡迎查看狡忙。 APP內(nèi)存的使用,是評(píng)價(jià)一款應(yīng)用性能高低的一個(gè)重要指標(biāo)址芯。雖然現(xiàn)在智能手機(jī)的內(nèi)...
    大圣代閱讀 4,823評(píng)論 2 54