Android內(nèi)存溢出及內(nèi)存泄漏原因進(jìn)解析
內(nèi)存溢出(Out Of Memory):Android系統(tǒng)中每一個(gè)應(yīng)用程序可以向系統(tǒng)申請(qǐng)一定的內(nèi)存,當(dāng)申請(qǐng)的內(nèi)存不夠用的時(shí)候,就產(chǎn)生了內(nèi)存溢出。
內(nèi)存泄漏:當(dāng)某個(gè)對(duì)象不再被使用,即不再有變量引用它時(shí),該對(duì)象占用的內(nèi)存就會(huì)被系統(tǒng)回收。當(dāng)某個(gè)對(duì)象不再被使用,但是在其他對(duì)象中仍然有變量引用它時(shí),該對(duì)象占用的內(nèi)存就無(wú)法被系統(tǒng)回收,從而導(dǎo)致了內(nèi)存泄漏。
當(dāng)內(nèi)存泄漏過(guò)多時(shí),可用內(nèi)存空間會(huì)減少,應(yīng)用程序申請(qǐng)的內(nèi)存不夠用,就會(huì)導(dǎo)致內(nèi)存溢出。
內(nèi)存溢出原因:
1.內(nèi)存泄漏過(guò)多。
2.內(nèi)存中加載的數(shù)據(jù)量超過(guò)內(nèi)存的可用量。
3.集合類(用于存儲(chǔ)對(duì)象的引用)中有對(duì)對(duì)象的引用,使用完后未清空。
4.申請(qǐng)的內(nèi)存不夠。
5.死循環(huán)或者循環(huán)產(chǎn)生過(guò)多對(duì)象實(shí)例,導(dǎo)致大量?jī)?nèi)存被消耗。
。。。
內(nèi)存泄漏原因:
1.資源對(duì)象沒(méi)有關(guān)閉:
(1)注冊(cè)廣播接收器后沒(méi)有調(diào)用unregisterReceiver()方法注銷廣播接收器。
(2)打開文件流之后沒(méi)有調(diào)用close()方法關(guān)閉文件流。
(3)數(shù)據(jù)庫(kù)游標(biāo)cursor使用完后沒(méi)有調(diào)用close()方法關(guān)閉游標(biāo)。
(4)圖片資源Bitmap使用完之后沒(méi)有調(diào)用recycle()方法回收。
。。。
2.生命周期長(zhǎng)的對(duì)象持有生命周期短的對(duì)象的引用,導(dǎo)致生命周期短的對(duì)象內(nèi)存無(wú)法被回收:
(1)單例模式或者靜態(tài)成員變量的生命周期和應(yīng)用程序的生命周期相等,當(dāng)需要引用Context時(shí),如果傳入的是Activity的Context,Activity需要被銷毀時(shí)就無(wú)法被回收。解決方法是傳入Application的Context,因?yàn)锳pplication的Context生命周期等于應(yīng)用程序的生命周期。
(2)非靜態(tài)內(nèi)部類(匿名內(nèi)部類、Handler等)默認(rèn)持有外部類的引用,如果非靜態(tài)內(nèi)部類的對(duì)象實(shí)例生命周期比外部類生命周期長(zhǎng)(比如非靜態(tài)內(nèi)部類定義了一個(gè)靜態(tài)的對(duì)象實(shí)例),外部類注銷時(shí)就無(wú)法被系統(tǒng)回收,從而導(dǎo)致內(nèi)存泄漏。解決方法是采用靜態(tài)內(nèi)部類+弱引用的方式。
總結(jié):內(nèi)存泄漏產(chǎn)生的原因主要有兩種:一種是資源對(duì)象在使用完后沒(méi)有進(jìn)行關(guān)閉操作。另一種是生命周期長(zhǎng)的對(duì)象引用了生命周期短的對(duì)象,導(dǎo)致生命周期短的對(duì)象即使不再使用但仍然無(wú)法被系統(tǒng)回收。根本原因在于需要被回收的內(nèi)存資源沒(méi)有被系統(tǒng)回收。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Socket.IO實(shí)現(xiàn)Android聊天功能代碼示例
本篇文章主要介紹了基于Socket.IO實(shí)現(xiàn)Android聊天功能代碼示例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
android開發(fā)教程之時(shí)間對(duì)話框核心代碼
這篇文章主要介紹了android的時(shí)間對(duì)話框核心代碼,需要的朋友可以參考下2014-04-04
Android Service(不和用戶交互應(yīng)用組件)案例分析
Service是在一段不定的時(shí)間運(yùn)行在后臺(tái),不和用戶交互應(yīng)用組件,本文將詳細(xì)介紹,需要了解的朋友可以參考下2012-12-12
Android shell命令行中過(guò)濾adb logcat輸出的方法
本文主要介紹Android shell命令行中過(guò)濾adb logcat輸出,這里詳細(xì)說(shuō)明了shell 命令過(guò)濾logcat 輸出內(nèi)容,有需要的小伙伴可以參考下2016-08-08
Android實(shí)現(xiàn)郵箱驗(yàn)證功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)郵箱驗(yàn)證功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Android傳感器SensorEventListener之加速度傳感器
今天小編就為大家分享一篇關(guān)于Android傳感器SensorEventListener之加速度傳感器,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Jetpack?Compose?Canvas繪制超詳細(xì)介紹
Canvas?是允許您在屏幕上指定區(qū)域并在此區(qū)域上執(zhí)行繪制的組件。您必須使用修飾符指定尺寸,無(wú)論是通過(guò)Modifier.size修飾符指定確切尺寸,還是通過(guò)Modifier.fillMaxSize,ColumnScope.weight等相對(duì)于父級(jí)指定精確尺寸。如果父級(jí)包裝了此子級(jí),則僅必須指定確切尺寸2022-10-10
Android 帶箭頭的指引tipLayout實(shí)現(xiàn)示例代碼
本篇文章主要介紹了Android 帶箭頭的指引tipLayout實(shí)現(xiàn)示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android實(shí)現(xiàn)獲取聯(lián)系人電話號(hào)碼功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)獲取聯(lián)系人電話號(hào)碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android中TextView實(shí)現(xiàn)垂直滾動(dòng)和上下滾動(dòng)效果
這篇文章主要介紹了Android中TextView實(shí)現(xiàn)垂直滾動(dòng)效和上下滾動(dòng)效果,需要的朋友可以參考下2017-04-04

