Android內(nèi)存優(yōu)化四:OOM

Android內(nèi)存優(yōu)化一:java垃圾回收機制
Android內(nèi)存優(yōu)化二:內(nèi)存泄漏
Android內(nèi)存優(yōu)化三:內(nèi)存泄漏檢測與監(jiān)控
Android內(nèi)存優(yōu)化四:OOM
Android內(nèi)存優(yōu)化五:Bitmap優(yōu)化

產(chǎn)生原因

android系統(tǒng)的每個進程或者每個虛擬機有個最大內(nèi)存限制,如果申請的內(nèi)存資源超過這個限制,系統(tǒng)就會拋出OOM錯誤。跟整個設(shè)備的剩余內(nèi)存沒太大關(guān)系。

03-21 21:05:28.771: E/dalvikvm-heap(13316): Out of memory on a 10485776-byte allocation.
03-21 21:05:28.779: E/AndroidRuntime(13316): java.lang.OutOfMemoryError

根據(jù)Java垃圾回收機制-內(nèi)存分配策略

  • 對象新生代Eden區(qū)中分配,當 Eden 空間不夠時,虛擬機將發(fā)起一次Minor GC

  • 在Minor GC之前,會優(yōu)先判斷:當老年代最大可用的連續(xù)空間小于新生代所有對象總空間,且老年代最大可用的連續(xù)空間小于歷次晉升到老年代對象的平均大小,則會觸發(fā)Full GC

  • 當Full GC 之后,空間仍然不足,那么虛擬機會拋出 java.lang.OutOfMemoryError。

優(yōu)化

  • 內(nèi)存泄漏

內(nèi)存泄漏的對象屬于長期存活的對象,會進入老年代,并且由于無法被GC回收,一直占用著內(nèi)存,導(dǎo)致內(nèi)存不足而產(chǎn)生OOM,所以只需要解決內(nèi)存泄漏就可以解決這一部分問題

  • 大對象

大對象是指需要連續(xù)內(nèi)存空間的對象,比如Bitmap,很長的字符串以及數(shù)組。當內(nèi)存剩余總空間不足,或者連續(xù)空間不足,也會產(chǎn)生OOM

解決大對象產(chǎn)生的OOM主要有以下幾點

  • 合理分配所需內(nèi)存,比如只需要展示100100的bitmap,但卻申請了500500的內(nèi)存,導(dǎo)致了內(nèi)存浪費

  • 利用緩存,復(fù)用大對象的內(nèi)存空間,避免在內(nèi)存中申請多個大對象的內(nèi)存

  • 數(shù)據(jù)結(jié)構(gòu)

Java 提供的部分數(shù)據(jù)容器并不適合 Android,比如 HashMap,HashMap 需要中存儲每一個鍵值對都需要一個額外的 Entry 對象。

Android 提供了幾個優(yōu)化后的數(shù)據(jù)容器,包括 SparseArray、SparseBooleanArray 以及 LongSparseArray。SparseArray 之所以更高效,是因為它的設(shè)計是只能使用整型作為 key,這樣就避免了自動裝箱的開銷。

  • 業(yè)務(wù)調(diào)整

某些業(yè)務(wù)場景可能需要占用大量內(nèi)存

  • 頁面循環(huán)跳轉(zhuǎn)A->B->A->B->A->B...,Activity棧太深,導(dǎo)致多個頁面占用大量內(nèi)存。

解決:比如設(shè)定一個闕值,最多只能同時存在3個A頁面,超過則關(guān)閉最先打開的頁面

  • fragment持有View

fragment與View具有不一致的生命周期,當fragment不可見時,如果仍持有View會導(dǎo)致無法View無法被回收,而View是內(nèi)存大戶,特別是ImageView。

不到萬不得以,fragment不需要持有View,如果為了狀態(tài)恢復(fù)等原因需要持有,可在onDestoryView中將View置空或者回收View持有的Bitmap等大對象

。。。。。

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

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

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