android--內(nèi)存優(yōu)化篇

內(nèi)存泄漏:對象在內(nèi)存heap堆中中分配的控件幔托,但不再使用或沒有引用指向的情況下票编,仍不能被GC正惩ǎ回收的情況。多數(shù)出現(xiàn)在不合理的編碼情況下兑障,比如在Activity中注冊了一個廣播接收器侄非,但是在頁面關(guān)閉的時候進(jìn)行unRegister(或者說以下一些內(nèi)存泄漏的情況)就會出現(xiàn)內(nèi)存溢出的現(xiàn)象。通常情況下流译,大量的內(nèi)存泄漏會造成OMM.

OOM:即OutOfMemoery,顧名思義就是指內(nèi)存溢出了逞怨。內(nèi)存溢出是指APP向系統(tǒng)申請超過最大閥值的內(nèi)存請求,系統(tǒng)不會再分配多余的空間福澡,就會造成OOM error叠赦。在我們Android平臺下,多數(shù)情況是出現(xiàn)在圖片不當(dāng)處理加載的時候革砸。

內(nèi)存管理之道除秀,無非就是先理解并找出內(nèi)存泄漏的原因,在基于這些反式去合理的編碼算利,去防范進(jìn)而避免內(nèi)存開銷過大的情形册踩。學(xué)習(xí)如何合理的管理內(nèi)存,最好先了解內(nèi)存分配的機(jī)制和原理(效拭?暂吉??)缎患。只有深層次的理解了內(nèi)部的原理借笙,才能真正避免OOM的發(fā)生。

Android App因?yàn)閍ndroid是開源系統(tǒng)较锡,不同的手機(jī)廠商其實(shí)是具有修改這部分權(quán)限能力的业稼,所以就造成了不同品牌和不同系統(tǒng)的手機(jī),對于APP的內(nèi)存支持也是不一樣的蚂蕴,和iOS的恒久100MB是不同的低散。一般來說俯邓,手機(jī)內(nèi)存的配置越高,廠商也會調(diào)大手機(jī)支持的內(nèi)存最大閥值熔号,無法保證APP運(yùn)行在何種手機(jī)上稽鞭,只能從編碼角度來優(yōu)化內(nèi)存了。

下面我們來逐條來分析Android內(nèi)存優(yōu)化的關(guān)鍵點(diǎn)引镊。

1朦蕴、萬惡的static
static是個好東西,聲明賦值調(diào)用就是那么簡單方便弟头,但是伴隨而來的還有性能問題吩抓。由于static聲明變量的聲明周期其實(shí)是和APP的生命周期一樣的,有點(diǎn)類似與Application赴恨。如果大量的使用的話疹娶,就會占據(jù)內(nèi)存空間不釋放,積少成多也會造化曾內(nèi)存的不斷開銷伦连,直至掛掉雨饺。static的合理使用一般用來修飾基本數(shù)據(jù)類型或者輕量級對象,盡量避免修復(fù)集合或者大度想惑淳,常用作修飾全局配置項(xiàng)额港、工具類方法、內(nèi)部類歧焦。

2移斩、無關(guān)引用
很多情況下,我們需求用到傳遞引用倚舀,但是我們無法確保引用傳遞出去后能否及時的回收叹哭。比如比較有代表性的Context泄漏,很多情況下當(dāng)Activity結(jié)束掉后痕貌,由于仍被其他的對象指向?qū)е乱恢边t遲不能回收风罩,這就造成了內(nèi)存泄漏。這時可以考慮第三條建議舵稠。

3超升、善用SoftReference/WeakReference/LruCache(?哺徊?室琢?)
Java、Android在中有沒有這樣一種機(jī)制呢落追,當(dāng)內(nèi)存吃緊或者GC掃過的情況下盈滴,就能及時把一些內(nèi)存占用給釋放掉,從而分配給需要分配的地方。答案是肯定的巢钓,java為我們提供了兩個解決方案病苗。如果對內(nèi)存的開銷比較關(guān)注的App,可以考慮使用WeakReference症汹,當(dāng)GC回收掃過這塊內(nèi)存區(qū)域時就會回收硫朦;如果不是那么關(guān)注的話,可以使用SoftReference背镇,它會在內(nèi)存申請不足的情況下自動釋放咬展,同樣也能解決OOM問題。Android自3.0以后也推出了LruCache類瞒斩,使用LRU算法就釋放內(nèi)存破婆,一樣的能解決OOM,如果兼容3.0一下的版本,請導(dǎo)入v4包济瓢。關(guān)于 第二條的無關(guān)引用的問題荠割,我們傳參可以考慮使用WeakReference包裝一下妹卿。

4旺矾、謹(jǐn)慎handler
在處理異步操作的時候哦,handler+thread是個不錯的選擇夺克。但是相信在使用handler的時候箕宙,大家都會遇到警告的情形,這個就是lint為開發(fā)者的體型铺纽。handler運(yùn)行與UI線程柬帕,不斷處理來自MessageQueue的消息,如果handler還有信息需要處理但是Activity頁面已經(jīng)結(jié)束的情況下狡门,Activity的引用其實(shí)并不會被回收陷寝,這就造成了內(nèi)存泄漏。解決方案其馏,一是在Activity的onDestroy方法中調(diào)用
handler.removeCallbacksAndMessages(null);取消所有的消息的處理凤跑,包括待處理的消息,二是聲明handler的內(nèi)部類為static叛复。

5仔引、Bitmap終極殺手
Bitmap的不當(dāng)處理極可能造成OOM,絕大多數(shù)情況都是因這個原因出現(xiàn)的褐奥。Bitmap位圖是Android中當(dāng)之無愧的胖小子咖耘,所以在操作的時候當(dāng)然是十分的小心了。由于Dalivk并不會主動的去回收撬码,需要開發(fā)者在Bitmap不被使用的時候recycle掉儿倒。使用的過程中,及時釋放是非常重要的呜笑。同時如果需求允許夫否,也可以去Bitmap進(jìn)行一定的縮放找筝,通過BitmapFactory.Options的inSampleSize屬性進(jìn)行控制。如果僅僅只想獲得Bitmap的屬性慷吊,其實(shí)并不需要根據(jù)Bitmap的像素去分配內(nèi)存袖裕,只需在解析讀取Bmp的時候使用BitmapFactory.Options的inJustDecodeBounds屬性。隨后建議大家在加載網(wǎng)絡(luò)圖片的時候溉瓶,使用軟引用或者弱引用并進(jìn)行本地緩存急鳄,推薦使用
android-universal-imageloader或者xUtils.

6、Cursor和I/O流及時關(guān)閉堰酿,在查詢SQLite數(shù)據(jù)庫時疾宏,會返回一個Cursor,當(dāng)查詢完畢后触创,及時關(guān)閉坎藐,這樣就可以把查詢的結(jié)果集及時給回收掉,I/O流操作關(guān)閉哼绑,讀取結(jié)束岩馍,記得關(guān)閉。

7抖韩、ListView item的緩存問題

8蛀恩、頁面背景和圖片加載

在布局和代碼中設(shè)置背景和圖片的時候,如果是純色茂浮,盡量使用color双谆,如果是規(guī)則圖形,盡量使用shape畫圖席揽;如果稍微復(fù)雜點(diǎn)顽馋,可以使用9patch圖;如果不能使用9patch的情況下幌羞,針對幾種主流分辨率的機(jī)型進(jìn)行切圖寸谜。
9、BroadCastReceiver新翎、Service
綁定廣播和服務(wù)程帕,一定要記得在不需要的時候給解綁。
10地啰、線程
線程不再需要繼續(xù)執(zhí)行的時候要記得及時關(guān)閉愁拭,開啟線程數(shù)量不易過多,一般和自己機(jī)器內(nèi)核數(shù)一樣最好亏吝,推薦開啟線程的時候岭埠,使用線程池。
11.String/StringBuffer
當(dāng)有較多的字符創(chuàng)需要拼接的時候,推薦使用StringBuffer惜论。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末许赃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子馆类,更是在濱河造成了極大的恐慌混聊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乾巧,死亡現(xiàn)場離奇詭異句喜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沟于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門咳胃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旷太,你說我怎么就攤上這事展懈。” “怎么了供璧?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵存崖,是天一觀的道長。 經(jīng)常有香客問我嗜傅,道長金句,這世上最難降的妖魔是什么檩赢? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任吕嘀,我火速辦了婚禮,結(jié)果婚禮上贞瞒,老公的妹妹穿的比我還像新娘偶房。我一直安慰自己,他們只是感情好军浆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布棕洋。 她就那樣靜靜地躺著,像睡著了一般乒融。 火紅的嫁衣襯著肌膚如雪掰盘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天赞季,我揣著相機(jī)與錄音愧捕,去河邊找鬼。 笑死申钩,一個胖子當(dāng)著我的面吹牛次绘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼邮偎,長吁一口氣:“原來是場噩夢啊……” “哼管跺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起禾进,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤豁跑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泻云,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贩绕,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年壶愤,在試婚紗的時候發(fā)現(xiàn)自己被綠了淑倾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡征椒,死狀恐怖娇哆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勃救,我是刑警寧澤碍讨,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站蒙秒,受9級特大地震影響勃黍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晕讲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一覆获、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓢省,春花似錦弄息、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馒胆,卻和暖如春缨称,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祝迂。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工睦尽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人液兽。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓骂删,卻偏偏與公主長得像掌动,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宁玫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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