1.避免創(chuàng)建不需要的對(duì)象。對(duì)于生命周期較短的臨時(shí)變量,盡量想辦法規(guī)避掉每次都要去創(chuàng)建它,這樣GC回收被強(qiáng)制調(diào)用機(jī)會(huì)就會(huì)更少,留給Android系統(tǒng)進(jìn)行UI渲染或者音頻加載的時(shí)間就會(huì)更多,從而避免了卡頓現(xiàn)象。
2.當(dāng)使用Service應(yīng)當(dāng)小心小心再小心!當(dāng)你需要啟動(dòng)一個(gè)服務(wù)在后臺(tái)執(zhí)行一項(xiàng)任務(wù)時(shí),應(yīng)當(dāng)在其完成工作之后盡快的停止此服務(wù)??梢钥紤]使用IntentService—當(dāng)在子線程完成耗時(shí)操作之后,IntentService會(huì)自動(dòng)停止并結(jié)束自身。然而在實(shí)際開(kāi)發(fā)中經(jīng)常會(huì)碰到需要服務(wù)去執(zhí)行一項(xiàng)耗時(shí)比較長(zhǎng)的任務(wù),比如:音樂(lè)播放器,下載APP等等。像這樣的應(yīng)用可以分隔為兩個(gè)進(jìn)程:一個(gè)進(jìn)程負(fù)責(zé) UI 工作, 另外一個(gè)則在后臺(tái)服務(wù)中運(yùn)行其它的工作. 在AndroidManifest 文件中為各個(gè)組件申明 android:process 屬性就可以分隔為不同的進(jìn)程。注意一點(diǎn):在后臺(tái)運(yùn)行的Service絕對(duì)不能處理或者持有任何UI,否則系統(tǒng)可能會(huì)分配雙倍甚至三倍的空間來(lái)維護(hù)UI資源!!
3.當(dāng)你加載 bitmap 時(shí), 需要根據(jù)當(dāng)前設(shè)備的分辨率加載相應(yīng)分辨率的bitmap進(jìn)入內(nèi)存,如果下載下來(lái)的原圖分辨率比設(shè)備分辨率高則要壓縮它. 要小心bitmap的分辨率增加后所占用的內(nèi)存也要進(jìn)行相應(yīng)的增加(平方級(jí)increase2的增長(zhǎng)), 因?yàn)樗歉鶕?jù)x和y的大小來(lái)增加內(nèi)存占用的。
4.避免使用枚舉Enum,一個(gè)Enum分配的空間是一個(gè)普通常量的兩倍,因此盡量少使用枚舉。
5.試著使用Android框架優(yōu)化后的數(shù)據(jù)容器,譬如:SparseArray, SparseBooleanArray, 以及 LongSparseArray containers. 使用這些類來(lái)替代HashMap的使用。 原因是傳統(tǒng)的 HashMap 在內(nèi)存上的實(shí)現(xiàn)十分的低效,因?yàn)樗枰獮?HashMap 中每一項(xiàng)在內(nèi)存中建立映射關(guān)系. 另外, SparseArray類非常高效因?yàn)樗苊饬藢?duì)key和value的自動(dòng)封箱.萬(wàn)事都有兩面性,這些個(gè)被優(yōu)化過(guò)的容器也不例外,千萬(wàn)記住SparseArray等容器并不適應(yīng)于內(nèi)部元素很多的集合,當(dāng)集合的長(zhǎng)度超過(guò)1000條時(shí),使用SparseArray進(jìn)行增刪改查的效率遠(yuǎn)比HashMap低。
6.慎用橋接模式,雖然從程序的設(shè)計(jì)角度來(lái)看,抽象能夠幫助我們創(chuàng)建更加靈活的軟件架構(gòu)。但是在手機(jī)系統(tǒng)中,這種設(shè)計(jì)模式有可能會(huì)造成很多副作用。 除非大有必要,否則盡量不要用橋接模式
7.檢測(cè)App內(nèi)存中的可用堆的大小,在代碼中可以通過(guò)動(dòng)態(tài)的調(diào)用ActivityManager::getMemoryClass()方法來(lái)查詢你的App中的可用內(nèi)存堆大小。如果系統(tǒng)檢測(cè)到需要分配的內(nèi)存大小超過(guò)了此值,則會(huì)拋出OOM錯(cuò)誤。
8.**可以適當(dāng)適應(yīng)onTrimMemory回調(diào)方法。OnTrimMemory 回調(diào)是 Android 4.0 之后提供的一個(gè)API,這個(gè) API 是提供給開(kāi)發(fā)者的,它的主要作用是提示開(kāi)發(fā)者在系統(tǒng)
內(nèi)存不足的時(shí)候,通過(guò)處理部分資源來(lái)釋放內(nèi)存,從而避免被 Android 系統(tǒng)殺死。這樣應(yīng)用在下一次啟動(dòng)的時(shí)候,速度就會(huì)比較快。
9.使用代碼混淆工具 ProGuard 通過(guò)去除沒(méi)有用的代碼和通過(guò)語(yǔ)義模糊來(lái)重命名類, 字段和方法來(lái)縮小, 優(yōu)化和混淆你的代碼. 使用它能使你的代碼更簡(jiǎn)潔, 更少量的RAM
映射頁(yè).如果構(gòu)建apk后你沒(méi)有做后續(xù)的任何處理(包括根據(jù)你的證書(shū)進(jìn)行簽名), 你必須運(yùn)行 zipalign 工具為你的apk進(jìn)行優(yōu)化, 如果不這樣做會(huì)導(dǎo)致你的應(yīng)用使用更多的 內(nèi)存,zipalign之后像資源這樣的東西不會(huì)再?gòu)腶pk中映射(mmap)入內(nèi)存.注意:goole play store 不接受沒(méi)有進(jìn)行zipalign的apk。
內(nèi)存優(yōu)化
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
- 本文轉(zhuǎn)載來(lái)源 http://www.csdn.net/article/2015-09-18/2825737/1 (...
- 前言 為了使垃圾回收器可以正常釋放程序所占用的內(nèi)存,在編寫(xiě)代碼的時(shí)候就一定要注意盡量避免出現(xiàn)內(nèi)存泄漏的情況(通常都...
- 如何避免OOM 一、減小對(duì)象的內(nèi)存占用 1、使用更加輕量的數(shù)據(jù)結(jié)構(gòu) 例如,我們可以考慮使用ArrayMap/Spa...