Android中如何實現(xiàn)內(nèi)存管理

這篇“Android中如何實現(xiàn)內(nèi)存管理”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android中如何實現(xiàn)內(nèi)存管理”文章吧。

成都創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站建設(shè)與策劃設(shè)計,塔什庫爾干塔吉克網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:塔什庫爾干塔吉克等地區(qū)。塔什庫爾干塔吉克做網(wǎng)站價格咨詢:028-86922220

內(nèi)存泄漏:對象在內(nèi)存heap堆中中分配的空間,當(dāng)不再使用或沒有引用指向的情況下,仍不能被GC正?;厥盏那闆r。多數(shù)出現(xiàn)在不合理的編碼情況下,比如在Activity中注冊了一個廣播接收器,但是在頁面關(guān)閉的時候進行unRegister,就會出現(xiàn)內(nèi)存溢出的現(xiàn)象。通常情況下,大量的內(nèi)存泄漏會造成OOM。


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)存泄漏的原因,再基于這些反式去合理的編碼,去防范進而避免內(nèi)存開銷過大的情形。學(xué)習(xí)如何合理的管理內(nèi)存,***先了解內(nèi)存分配的機制和原理。只有深層次的理解了內(nèi)部的原理,才能真正避免OOM的發(fā)生。但是本文就不介紹Jvm/Davilk內(nèi)存分配的機制了,如有興趣,請查看歷史消息,以前做過題為《JVM運行時數(shù)據(jù)區(qū)域分析》的分享。


Android APP的所能申請的***內(nèi)存大小是多少,有人說是16MB,有人又說是24MB。這種事情,還是親自用自己的手機測試下比較靠譜。測試方式也比較簡單,Java中有個Runtime類,主要用作APP與運行環(huán)境交互,APP并不會為我們創(chuàng)建Runtime的實例,但是Java為我們提供了單例獲取的方式Runtime.getRuntime()。通過maxMemory()方法獲取系統(tǒng)可為APP分配的***內(nèi)存,totalMemory()獲取APP當(dāng)前所分配的內(nèi)存heap空間大小。我手上有兩部手機,一部Oppo find7,運行Color OS,實測***內(nèi)存分配為192MB;一部天語v9,運行小米系統(tǒng),實測***內(nèi)存分配為100MB。這下看出點眉目了吧,由于Android是開源系統(tǒng),不同的手機廠商其實是擁有修改這部分權(quán)限能力的,所以就造成了不同品牌和不同系統(tǒng)的手機,對于APP的內(nèi)存支持也是不一樣的,和IOS的恒久100MB是不同的。一般來說,手機內(nèi)存的配置越高,廠商也會調(diào)大手機支持的內(nèi)存***閥值,尤其是現(xiàn)在旗艦機滿天發(fā)布的情況下。但是開發(fā)者為了考慮開發(fā)出的APP的內(nèi)存兼容性,無法保證APP運行在何種手機上,只能從編碼角度來優(yōu)化內(nèi)存了。

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

1、萬惡的static

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

2、無關(guān)引用

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

3、善用SoftReference/WeakReference/LruCache

Java、Android中有沒有這樣一種機制呢,當(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運行于UI線程,不斷處理來自MessageQueue的消息,如果handler還有消息需要處理但是Activity頁面已經(jīng)結(jié)束的情況下,Activity的引用其實并不會被回收,這就造成了內(nèi)存泄漏。解決方案,一是在Activity的onDestroy方法中調(diào)用

handler.removeCallbacksAndMessages(null);取消所有的消息的處理,包括待處理的消息;二是聲明handler的內(nèi)部類為static。

5、Bitmap***殺手

Bitmap的不當(dāng)處理極可能造成OOM,絕大多數(shù)情況都是因這個原因出現(xiàn)的。Bitamp位圖是Android中當(dāng)之無愧的胖小子,所以在操作的時候當(dāng)然是十分的小心了。由于Dalivk并不會主動的去回收,需要開發(fā)者在Bitmap不被使用的時候recycle掉。使用的過程中,及時釋放是非常重要的。同時如果需求允許,也可以去BItmap進行一定的縮放,通過BitmapFactory.Options的inSampleSize屬性進行控制。如果僅僅只想獲得Bitmap的屬性,其實并不需要根據(jù)BItmap的像素去分配內(nèi)存,只需在解析讀取Bmp的時候使用BitmapFactory.Options的inJustDecodeBounds屬性。***建議大家在加載網(wǎng)絡(luò)圖片的時候,使用軟引用或者弱引用并進行本地緩存,推薦使用android-universal-imageloader或者xUtils,牛人出品,必屬精品。前幾天在講《自定義控件(三)  繼承控件》的時候,也整理一個,大家可以去Github下載看看。

6、Cursor及時關(guān)閉

在查詢SQLite數(shù)據(jù)庫時,會返回一個Cursor,當(dāng)查詢完畢后,及時關(guān)閉,這樣就可以把查詢的結(jié)果集及時給回收掉。

7、頁面背景和圖片加載

在布局和代碼中設(shè)置背景和圖片的時候,如果是純色,盡量使用color;如果是規(guī)則圖形,盡量使用shape畫圖;如果稍微復(fù)雜點,可以使用9patch圖;如果不能使用9patch的情況下,針對幾種主流分辨率的機型進行切圖。

8、ListView和GridView的item緩存

對于移動設(shè)備,尤其硬件參差不齊的android生態(tài),頁面的繪制其實是很耗時的,findViewById也是蠻慢的。所以不重用View,在有列表的時候就尤為顯著了,經(jīng)常會出現(xiàn)滑動很卡的現(xiàn)象。具體參照歷史文章《說說ViewHolder的另一種寫法》

9、BroadCastReceiver、Service

綁定廣播和服務(wù),一定要記得在不需要的時候給解綁。

10、I/O流

I/O流操作完畢,讀寫結(jié)束,記得關(guān)閉。

11、線程

線程不再需要繼續(xù)執(zhí)行的時候要記得及時關(guān)閉,開啟線程數(shù)量不易過多,一般和自己機器內(nèi)核數(shù)一樣***,推薦開啟線程的時候,使用線程池。

12、String/StringBuffer

當(dāng)有較多的字符創(chuàng)需要拼接的時候,推薦使用StringBuffer。

以上就是關(guān)于“Android中如何實現(xiàn)內(nèi)存管理”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁標(biāo)題:Android中如何實現(xiàn)內(nèi)存管理
標(biāo)題URL:http://bm7419.com/article10/iihhgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站設(shè)計、ChatGPT、品牌網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)