內(nèi)存優(yōu)化要點(diǎn)

手機(jī)的內(nèi)存(RAM,Random-access memory)是寶貴的,如果應(yīng)用運(yùn)行消耗大量內(nèi)存,可能還會導(dǎo)致OOM 問題,所以優(yōu)化應(yīng)用的運(yùn)行內(nèi)存是每一個應(yīng)用都應(yīng)該進(jìn)行的工作。

本篇主要記錄優(yōu)化應(yīng)用內(nèi)存的一些要點(diǎn)。

1. 謹(jǐn)慎地使用Service

避免在不必要的情況下,在后臺一直運(yùn)行一個Service,如果確實(shí)需要一個后臺job ,可以考慮使用JobScheduler 來代替。

2. 使用更優(yōu)化的數(shù)據(jù)結(jié)構(gòu)

例如,當(dāng)key 為int、long 等基本類型時,可以使用SparseArray 系列來代替HashMap,將會使內(nèi)存的使用得到減少。

3. 注意代碼抽象

開發(fā)人員經(jīng)常將抽象簡單地用作良好的編程實(shí)踐,因?yàn)槌橄罂梢蕴岣叽a的靈活性,便于維護(hù)。但是,抽象的成本很高:通常它們需要更多的代碼才能執(zhí)行,需要更多的時間和更多的RAM才能將代碼映射到內(nèi)存中。因此,如果抽象沒有提供顯著的好處,就無需使用。

4. 可以使用nano protobuf 來做數(shù)據(jù)的序列化

Protocol buffers 是谷歌開發(fā)的用于序列化、結(jié)構(gòu)化數(shù)據(jù)的,類似XML,但是要更小、更快,但是如果決定要使用protobuf 的話,在客戶端應(yīng)該使用nano protobuf,因?yàn)槠胀ǖ膒rotobuf 會產(chǎn)生大量額外的代碼,會增加內(nèi)存使用。

5. 避免內(nèi)存抖動

無論是ART 還是Dalvik VM,都有垃圾收集器,一次GC 對于應(yīng)用的表現(xiàn)并沒有很大影響,但是短時間內(nèi)頻繁的GC 會造成卡頓等現(xiàn)象,這種短期內(nèi)的頻繁GC 會造成內(nèi)存抖動。

一般出現(xiàn)這種情況的場景是,在for 循環(huán)中創(chuàng)建大量的臨時對象,或者在View 的onDraw 方法中創(chuàng)建大的對象比如Paint、Bitmap 等。

6. 謹(jǐn)慎地使用內(nèi)存密集型的資源或類庫

一些很大的資源文件或者類庫在加載或運(yùn)行時都會增加內(nèi)存的使用。

7. 謹(jǐn)慎地使用靜態(tài)變量

靜態(tài)變量的生命周期和應(yīng)用是一樣長的,靜態(tài)變量持有的資源越多,占用的內(nèi)存就會更大。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容