Android Note - 内存优化
內存優化是Android性能優化的重點內容,一般來說,談及性能優化,肯定避不開內存優化。雖然現在手機內存都很大,但并不意味著我們的App在使用內存時能“為所欲為”。這篇就簡單地總結一下關于內存優化要注意的一些事項。
進程級別的內存策略
我們知道,Android 系統是一個基于 Linux 的開源系統,使用的是 Dalvik / Android Runtime 作為對應的虛擬機來執行代碼。底層內存分配機制在這里就不詳述了,只看 Application Framework 這一層。
首先,Android 中的內存分配由 ActivityManagerService 統一管理。這是一個很重要的類,除了內存管理之外,它還管理了 Activity 生命周期,啟動行為,消息派發等功能。當用戶點擊應用的啟動圖標時, ActivityManagerService 會請求系統創建一個進程,當進程創建完成之后,綁定給 ActivityManagerService,這時才會開始 App 本身的生命周期。
而關于內存回收這塊,Application Framework 給創建的進程規定了五個的回收類型優先級,即從最先被回收到最后被回收,分別是:
- Empty process 空進程
- Background process 后臺進程
- Service process 服務進程
- Visible process 可見進程
- Foreground process 前臺進程
然后在 ActivityManagerService 中,會對所有進程進行評分,并將評分同步到 Linux 內核中,最終由內核來執行內存回收
對象級別的內存策略
關于對象級別的內存管理策略,由于是應用程序自動管理內存分配以及內存回收(Java GC),能操作的有限,但是基本的概念還是要了解的,因為當你知道對象/變量在內存中是如何分配,以及分配到堆/棧/方法區的時候,在寫代碼的時候就會有意規避一些問題,達到內存優化的效果。
Android常見內存問題
內存泄漏
內存泄漏 Memory Leak,指的是內存申請并使用完畢以后,系統因為某些原因無法回收該內存塊的情況。其實質也是長生命周期對象持有短生命周期的對象,導致短生命周期對象需要被回收時,由于長生命周期的對象持有無法被回收的現象。
在Android中,以下幾個場景容易出現內存泄漏。
單例對象使用了非全局的 Context
這個是初學者容易犯的錯誤,在構造一個單例對象時,往往需要使用 Context 對象來初始化構造函數,并持有一個 Context對象,這時如果傳入一個非全局的 Context ,會導致該 Context對象在 GC 時無法回收,造成內存泄漏。
解決方案:單例使用 ApplicationContext ,這個對象的生命周期是整個應用的生命周期,不會導致泄漏
匿名內部類 / 非靜態內部類 / 異步線程 / Handler 持有外部類的引用
這也是常見的內存泄漏易于出現的場景。舉例來說,我們現在經常使用 Rxjava + Retrofit + OkHttp 來構建網絡請求。有時候會碰到網速過慢導致網絡請求返回慢或者超時的情況。這時如果我們關閉了當前頁面,網絡請求結果仍然會被觀察者接受并刷新UI。這時本來要被回收的UI對象由于被觀察者持有,無法回收,就導致了內存泄漏。
解決方案:
資源未關閉導致無法回收
這也是經常被提到的點,注冊并使用后,忘記在生命周期結束時解綁,導致無法回收。
解決方案:BroadcastReceiver、ContentObserver、File、Bitmap、Timer、EventBus 等都是需要解綁或者清空的,要養成直覺
WebView不要在布局中定義
這個是網絡上一篇文章里看到的,我想現在應該沒有多少人會在布局里定義 WebView 吧(還有 Fragment )
解決方案:在代碼中構造WebView對象,創建時上下文使用 ApplicationContext
內存溢出
內存溢出 Out Of Memory ,是指應用的內存申請超出了當前所能申請的最大內存容量,導致應用出現一系列問題甚至被系統殺掉進程。在 Android 中出現內存溢出,主要是因為以下原因引起。
使用 Bitmap 并且未優化
Bitmap 是產生內存溢出的大戶,如果沒有經過任何優化,直接加載一個 Bitmap 的話,會導致該對象吃掉大量內存。
解決方案:
短時間創建大量對象
這個常見于列表組件的加載。加載列表時如果不優化,同一時間內創建了過多對象,就會造成內存溢出。
解決方案:
其他內存溢出的場景和解決方案
轉載于:https://juejin.im/post/5cc965ffe51d453acd5050a4
總結
以上是生活随笔為你收集整理的Android Note - 内存优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ERP与进销存软件的区别
- 下一篇: 基于Android 虹软人脸、人证对比