Android應(yīng)用程序內(nèi)存泄漏的原因及規(guī)避方法
大?。?/span>0.4 MB 人氣: 2017-10-19 需要積分:1
推薦 + 挑錯(cuò) + 收藏(0) + 用戶(hù)評(píng)論(0)
標(biāo)簽:Android(124886)內(nèi)存泄漏(9129)
?引言Android應(yīng)用程序中內(nèi)存使用的問(wèn)題經(jīng)常容易被忽視,在傳統(tǒng)的編程語(yǔ)言中(例如C語(yǔ)言),回收內(nèi)存的任務(wù)是由程序本身來(lái)完成的,程序可以顯式分配和釋放變量所占用的內(nèi)存。Android[1]應(yīng)用程序采用Java編程語(yǔ)言編寫(xiě),而Java區(qū)別于其他語(yǔ)言的一個(gè)重要優(yōu)點(diǎn)就是它通過(guò)垃圾收集器(Garbage Collection,GC) 自動(dòng)管理內(nèi)存的回收,Java程序員只需通過(guò)內(nèi)存分配操作創(chuàng)建對(duì)象,而無(wú)須關(guān)心對(duì)象占用的空間是如何被收回的。因此很多程序員認(rèn)為在Java中不必?fù)?dān)心內(nèi)存泄漏的問(wèn)題,然而實(shí)際并非如此,Java中仍然存在著內(nèi)存泄漏。Android應(yīng)用程序運(yùn)行在嵌入式系統(tǒng)中,而嵌入式系統(tǒng)中內(nèi)存的總量非常有限,因此如何合理地規(guī)避“內(nèi)存泄露”問(wèn)題也就顯得十分關(guān)鍵。
1 造成Android應(yīng)用程序內(nèi)存泄漏的原因
1.1 引用沒(méi)釋放造成的內(nèi)存泄露
(1) 注冊(cè)沒(méi)有取消造成的內(nèi)存泄漏
這種Android的內(nèi)存泄露比純Java的內(nèi)存泄漏還要嚴(yán)重,因?yàn)槠渌恍〢ndroid程序可能引用系統(tǒng)的Android程序的對(duì)象(比如注冊(cè)機(jī)制)。即使Android程序已經(jīng)結(jié)束了,但是別的應(yīng)用程序仍然還有對(duì)Android程序的某個(gè)對(duì)象的引用,泄漏的內(nèi)存依然不能被垃圾回收。
(2) 集合中對(duì)象沒(méi)有關(guān)閉造成的內(nèi)存泄漏
通常把一些對(duì)象的引用加入到了集合中,當(dāng)我們不需要該對(duì)象時(shí),并沒(méi)有把它的引用從集合中清理掉,慢慢地這個(gè)集合就會(huì)越來(lái)越大。如果這個(gè)集合是靜態(tài)的話(huà),那情況就會(huì)更嚴(yán)重。
1.2 資源對(duì)象沒(méi)有關(guān)閉造成的內(nèi)存泄漏
資源對(duì)象比如Cursor、File文件等往往都用了一些緩沖,在不使用的時(shí)候應(yīng)該及時(shí)關(guān)閉它們,以便它們的緩沖及時(shí)回收內(nèi)存。這些緩沖不僅存在于Java虛擬機(jī)內(nèi),還存在于Java虛擬機(jī)外,如果僅僅是把它的引用設(shè)置為空,而不關(guān)閉它們,那么往往會(huì)造成內(nèi)存泄漏。
一些不良代碼造成的內(nèi)存壓力原因如下:
◆ Bitmap沒(méi)有調(diào)用recycle( );
◆ 構(gòu)造Adapter時(shí),沒(méi)有使用緩存的convertView;
◆ ThreadLocal使用不當(dāng);
◆ 其他。
2 內(nèi)存泄漏的檢測(cè)及定位
2.1 內(nèi)存泄漏的檢測(cè)
Android應(yīng)用程序是基于虛擬機(jī)的,其內(nèi)存管理都是由Dalvik[2]代為管理,GC的回收不是及時(shí)的。一個(gè)正常的應(yīng)用程序在其運(yùn)行穩(wěn)定后其內(nèi)存的占用量是基本穩(wěn)定的,不應(yīng)該是無(wú)限制的增長(zhǎng)。同樣,對(duì)任何一個(gè)類(lèi)的對(duì)象的使用個(gè)數(shù)也有一個(gè)相對(duì)穩(wěn)定的上限,不應(yīng)該是持續(xù)增長(zhǎng)的。當(dāng)我們持續(xù)地觀察某個(gè)應(yīng)用程序運(yùn)行過(guò)程中使用內(nèi)存的大小和各實(shí)例的個(gè)數(shù)時(shí),如果內(nèi)存的大小持續(xù)增長(zhǎng),則說(shuō)明系統(tǒng)存在內(nèi)存泄漏的問(wèn)題;如果特定類(lèi)的實(shí)例對(duì)象個(gè)數(shù)隨時(shí)間而增長(zhǎng),則說(shuō)明這個(gè)類(lèi)的實(shí)例可能存在泄漏情況。比如一個(gè)Activity被關(guān)掉之后,其內(nèi)存的引用對(duì)象會(huì)在下次GC回收[3]的時(shí)候通過(guò)回收算法計(jì)算,如果這部分內(nèi)存已經(jīng)屬于可回收的對(duì)象,那么這些垃圾對(duì)象會(huì)被一并回收,內(nèi)存未泄漏趨勢(shì)圖如圖1所示。

圖1 內(nèi)存未泄漏趨勢(shì)圖
內(nèi)存泄漏趨勢(shì)圖如圖2所示。在重復(fù)打開(kāi)關(guān)閉某個(gè)應(yīng)用程序的時(shí)候,內(nèi)存一直在向上爬升,也就是說(shuō)每次關(guān)閉這個(gè)Activity的時(shí)候,有些應(yīng)該釋放的內(nèi)存并沒(méi)有被釋放掉。由此我們可以確定這個(gè)應(yīng)用程序存在著內(nèi)存泄漏的問(wèn)題。
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
Android應(yīng)用程序內(nèi)存泄漏的原因及規(guī)避方法下載
相關(guān)電子資料下載
- 社區(qū)說(shuō)|多才多藝: 探索 Android 應(yīng)用更多可能 13
- 浩辰軟件正式登陸上交所科創(chuàng)板 274
- 鴻蒙原生應(yīng)用,對(duì)開(kāi)發(fā)者意味著什么? 77
- Android端自定義鈴聲 MobPush對(duì)安卓端自定義鈴聲的教程 531
- Android推送問(wèn)題排查技巧 針對(duì)MobPush安卓端推送問(wèn)題的解決辦法 54
- 如何使用Proxyman抓取Android的https請(qǐng)求? 43
- 基于OkHttp 3.10.0的源碼案例解析 26
- 基于MacroBenchmark的性能測(cè)試量化指標(biāo)方案 77
- 圖像放大為什么還能保持清晰度 圖像縮放的原理是什么 45
- 智能門(mén)鎖產(chǎn)品中應(yīng)用的抗干擾低功耗觸摸感應(yīng)芯片 92