Android性能優化:手把手帶你全面實現內存優化 前言 在 Android開發中,性能優化策略十分重要 本文主要講解性能優化中的內存優化,希望你們會喜歡 目錄 1. 定義 優化處理 應用程序的內存使用、空間佔用 2. 作用 避免因不正確使用內存 & 缺乏管理,從而出現 內存泄露(ML)、內存溢出(OOM)、內存空間佔用過大 等問題,最終導致應用程序崩潰(Crash) 3. 儲備知識:Android 內存管理機制 3.1 簡介 下面,將針對回收 進程、對象 、變數的內存分配 & 回收進行詳細講解 3.2 針對進程的內存策略 a. 內存分配策略 由 ActivityManagerService 集中管理 所有進程的內存分配 b. 內存回收策略 步驟1:Application Framework 決定回收的進程類型Android中的進程 是託管的;當進程空間緊張時,會 按進程優先順序低->>高的順序 自動回收進程 Android將進程分為5個優先等級,具體如下: 步驟2:Linux 內核真正回收具體進程 ActivityManagerService 對 所有進程進行評分(評分存放在變數adj中) 更新評分到Linux 內核 由Linux 內核完成真正的內存回收 此處僅總結流程,這其中的過程複雜,有興趣的讀者可研究系統源碼ActivityManagerService.java 3.3 針對對象、變數的內存策略 Android的對於對象、變數的內存策略同 Java 內存管理 = 對象 / 變數的內存分配 + 內存釋放 下面,將詳細講解內存分配 & 內存釋放策略 a. 內存分配策略 對象 / 變數的內存分配 由程序自動 負責 共有3種:靜態分配、棧式分配、 & 堆式分配,分別面向靜態變數、局部變數 & 對象實例 具體介紹如下 註:用1個實例講解 內存分配public class Sample { // 該類的實例對象的成員變數s1、mSample1 & 指向對象存放在堆內存中 int s1 = 0; Sample mSample1 = new Sample(); // 方法中的局部變數s2、mSample2存放在 棧內存 // 變數mSample2所指向的對象實例存放在 堆內存 public void method() { int s2 = 0; Sample mSample2 = new Sample(); } } // 變數mSample3的引用存放在棧內存中 // 變數mSample3所指向的對象實例存放在堆內存 // 該實例的成員變數s1、mSample1也存放在堆內存中 Sample mSample3 = new Sample(); b. 內存釋放策略 對象 / 變數的內存釋放 由Java垃圾回收器(GC) / 幀棧 負責 此處主要講解對象分配(即堆式分配)的內存釋放策略 = Java垃圾回收器(GC) 由於靜態分配不需釋放、棧式分配僅 通過幀棧自動出、入棧,較簡單,故不詳細描述 Java垃圾回收器(GC)的內存釋放 = 垃圾回收演算法,主要包括: 具體介紹如下 4. 常見的內存問題 & 優化方案 常見的內存問題如下 內存泄露 內存抖動 圖片Bitmap相關 代碼質量 & 數量 日常不正確使用 下面,我將詳細分析每項的內存問題 & 給出優化方案 4.1 內存泄露 簡介即 ML (Memory Leak),指 程序在申請內存後,當該內存不需再使用 但 卻無法被釋放 & 歸還給 程序的現象 對應用程序的影響容易使得應用程序發生內存溢出,即 OOM 內存溢出 簡介: 發生內存泄露的本質原因 常見內存泄露原因 集合類 Static關鍵字修飾的成員變數 非靜態內部類 / 匿名類 資源對象使用後未關閉 優化方案具體請看文章:Android性能優化:手把手帶你全面了解 內存泄露 & 解決方案 4.2 圖片資源Bitmap相關 優化原因即 為什麼要優化圖片Bitmap資源,具體如下圖: 優化方向主要 從 以下方面優化圖片Bitmap資源的使用 & 內存管理 具體優化方案下面,我將詳細講解每個優化方向的具體優化方案 關於更加具體的介紹,請看文章:Android性能優化:那些關於Bitmap優化的小事 4.3 內存抖動 簡介 優化方案 盡量避免頻繁創建大量、臨時的小對象 4.4 代碼質量 & 數量 優化原因代碼本身的質量(如 數據結構、數據類型等) & 數量(代碼量的大小)可能會導致大量的內存問題,如佔用內存大、內存利用率低等 優化方案主要從代碼總量、數據結構、數據類型、 & 數據對象引用 方面優化,具體如下 4.5 常見使用 優化原因一些常見使用也可能引發大量的內存問題,下面我將詳細介紹。 優化方案 註: 還有1個內存優化的終極方案:調大 虛擬機Dalvik的堆內存大小 即 在AndroidManifest.xml的application標籤中增加一個android:largeHeap屬性(值 = true),從而通知虛擬機 應用程序需更大的堆內存 但不建議 & 不鼓勵該做法 4.6 額外小技巧 此處,還有一些內存優化的小技巧希望告訴給大家 技巧1:獲取當前可使用的內存大小調用 ActivityManager.getMemoryClass()方法可獲取當前應用可用的內存大小(單位 = 兆) 技巧2:獲取當前的內存使用情況在應用生命周期的任何階段,調用 onTrimMemory()獲取應用程序 當前內存使用情況(以內存級別進行識別),可根據該方法返回的內存緊張級別參數 來釋放內存 Android 4.0 後提供的一個API 技巧3:當視圖變為隱藏狀態時,則釋放內存當用戶跳轉到不同的應用 & 視圖不再顯示時, 應釋放應用視圖所佔的資源 註:此時釋放所佔用的資源能顯著的提高系統的緩存處理容量 具體操作:實現當前Activity類的onTrimMemory()後,當用戶離開視圖時會得到通知;若得到返回的參數 = TRIM_MEMORY_UI_HIDDEN 即代表視圖變為隱藏狀態,則可釋放視圖所佔用的資源. 5. 輔助內存優化的分析工具 哪怕完全了解 內存的原因,但難免還是會出現人為難以發現的內存問題 下面將簡單介紹幾個主流的輔助分析內存優化的工具,分別是 MAT(Memory Analysis Tools) Heap Viewer Allocation Tracker Android Studio 的 Memory Monitor LeakCanary 5.1 MAT(Memory Analysis Tools) 定義:一個Eclipse的 Java Heap 內存分析工具 ->>下載地址 作用:查看當前內存佔用情況 通過分析 Java 進程的內存快照 HPROF 分析,快速計算出在內存中對象佔用的大小,查看哪些對象不能被垃圾收集器回收 & 可通過視圖直觀地查看可能造成這種結果的對象 具體使用:MAT使用攻略 5.2 Heap Viewer 定義:一個的 Java Heap 內存分析工具 作用:查看當前內存快照 可查看 分別有哪些類型的數據在堆內存總 & 各種類型數據的佔比情況 具體使用:Heap Viewer使用攻略 5.3 Allocation Tracker 簡介:一個內存追蹤分析工具 作用:追蹤內存分配信息,按順序排列 具體使用:Allocation Tracker使用攻略 5.4 Memory Monitor 簡介:一個 Android Studio 自帶 的圖形化檢測內存工具 作用:跟蹤系統 / 應用的內存使用情況。核心功能如下 具體使用:Android Studio 的 Memory Monitor使用攻略 5.5 LeakCanary 簡介:一個square出品的Android開源庫 ->>下載地址 作用:檢測內存泄露 具體使用:https://www.liaohuqiu.net/cn/posts/leak-canary/ 至此,關於內存優化的所有知識講解完畢 6. 總結 本文主要講解內存優化的相關知識,總結如下: 鏈接:https://www.jianshu.com/p/9745a9375191 轉載請註明原文鏈接下面我將繼續深入講解 Android中的性能優化知識,有興趣可以繼續關注 推薦閱讀: 相关文章 {{#data}} {{title}} {{/data}}