溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android內(nèi)存溢出及內(nèi)存泄漏原因進(jìn)行

發(fā)布時間:2020-08-23 15:18:36 來源:腳本之家 閱讀:174 作者:志不堅者智不達(dá) 欄目:開發(fā)技術(shù)

內(nèi)存溢出(Out Of Memory):Android系統(tǒng)中每一個應(yīng)用程序可以向系統(tǒng)申請一定的內(nèi)存,當(dāng)申請的內(nèi)存不夠用的時候,就產(chǎn)生了內(nèi)存溢出。

內(nèi)存泄漏:當(dāng)某個對象不再被使用,即不再有變量引用它時,該對象占用的內(nèi)存就會被系統(tǒng)回收。當(dāng)某個對象不再被使用,但是在其他對象中仍然有變量引用它時,該對象占用的內(nèi)存就無法被系統(tǒng)回收,從而導(dǎo)致了內(nèi)存泄漏。

當(dāng)內(nèi)存泄漏過多時,可用內(nèi)存空間會減少,應(yīng)用程序申請的內(nèi)存不夠用,就會導(dǎo)致內(nèi)存溢出。

內(nèi)存溢出原因:

1.內(nèi)存泄漏過多。

2.內(nèi)存中加載的數(shù)據(jù)量超過內(nèi)存的可用量。

3.集合類(用于存儲對象的引用)中有對對象的引用,使用完后未清空。

4.申請的內(nèi)存不夠。

5.死循環(huán)或者循環(huán)產(chǎn)生過多對象實例,導(dǎo)致大量內(nèi)存被消耗。

。。。

內(nèi)存泄漏原因:

1.資源對象沒有關(guān)閉:

(1)注冊廣播接收器后沒有調(diào)用unregisterReceiver()方法注銷廣播接收器。

(2)打開文件流之后沒有調(diào)用close()方法關(guān)閉文件流。

(3)數(shù)據(jù)庫游標(biāo)cursor使用完后沒有調(diào)用close()方法關(guān)閉游標(biāo)。

(4)圖片資源Bitmap使用完之后沒有調(diào)用recycle()方法回收。

。。。

2.生命周期長的對象持有生命周期短的對象的引用,導(dǎo)致生命周期短的對象內(nèi)存無法被回收:

(1)單例模式或者靜態(tài)成員變量的生命周期和應(yīng)用程序的生命周期相等,當(dāng)需要引用Context時,如果傳入的是Activity的Context,Activity需要被銷毀時就無法被回收。解決方法是傳入Application的Context,因為Application的Context生命周期等于應(yīng)用程序的生命周期。

(2)非靜態(tài)內(nèi)部類(匿名內(nèi)部類、Handler等)默認(rèn)持有外部類的引用,如果非靜態(tài)內(nèi)部類的對象實例生命周期比外部類生命周期長(比如非靜態(tài)內(nèi)部類定義了一個靜態(tài)的對象實例),外部類注銷時就無法被系統(tǒng)回收,從而導(dǎo)致內(nèi)存泄漏。解決方法是采用靜態(tài)內(nèi)部類+弱引用的方式。

總結(jié):內(nèi)存泄漏產(chǎn)生的原因主要有兩種:一種是資源對象在使用完后沒有進(jìn)行關(guān)閉操作。另一種是生命周期長的對象引用了生命周期短的對象,導(dǎo)致生命周期短的對象即使不再使用但仍然無法被系統(tǒng)回收。根本原因在于需要被回收的內(nèi)存資源沒有被系統(tǒng)回收。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI