在 <code>Android</code>開發中,性能優化政策十分重要
本文主要講解性能優化中的記憶體優化,希望你們會喜歡

優化處理 應用程式的記憶體使用、空間占用
避免因不正确使用記憶體 & 缺乏管理,進而出現 記憶體洩露<code>(ML)</code>、記憶體溢出<code>(OOM)</code>、記憶體空間占用過大 等問題,最終導緻應用程式崩潰(<code>Crash</code>)
下面,将針對回收 程序、對象 、變量的記憶體配置設定 & 回收進行詳細講解
由 <code>ActivityManagerService</code> 集中管理 所有程序的記憶體配置設定
步驟1:<code>Application Framework</code> 決定回收的程序類型
Android中的程序 是托管的;當程序空間緊張時,會 按程序優先級低->>高的順序 自動回收程序
Android将程序分為5個優先等級,具體如下:
步驟2:<code>Linux</code> 核心真正回收具體程序
<code>ActivityManagerService</code> 對 所有程序進行評分(評分存放在變量<code>adj</code>中)
更新評分到<code>Linux</code> 核心
由<code>Linux</code> 核心完成真正的記憶體回收
此處僅總結流程,這其中的過程複雜,有興趣的讀者可研究系統源碼<code>ActivityManagerService.java</code>
<code>Android</code>的對于對象、變量的記憶體政策同 <code>Java</code>
記憶體管理 = 對象 / 變量的記憶體配置設定 + 記憶體釋放
下面,将詳細講解記憶體配置設定 & 記憶體釋放政策
對象 / 變量的記憶體配置設定 由程式自動 負責
共有3種:靜态配置設定、棧式配置設定、 & 堆式配置設定,分别面向靜态變量、局部變量 & 對象執行個體
具體介紹如下
注:用1個執行個體講解 記憶體配置設定
對象 / 變量的記憶體釋放 由<code>Java</code>垃圾回收器(<code>GC</code>) / 幀棧 負責
此處主要講解對象配置設定(即堆式配置設定)的記憶體釋放政策 = <code>Java</code>垃圾回收器(<code>GC</code>)
由于靜态配置設定不需釋放、棧式配置設定僅 通過幀棧自動出、入棧,較簡單,故不較長的描述
<code>Java</code>垃圾回收器(<code>GC</code>)的記憶體釋放 = 垃圾回收算法,主要包括:
常見的記憶體問題如下
記憶體洩露
記憶體抖動
圖檔<code>Bitmap</code>相關
代碼品質 & 數量
日常不正确使用
下面,我将詳細分析每項的記憶體問題 & 給出優化方案
簡介
即 <code>ML (Memory Leak)</code>,指 程式在申請記憶體後,當該記憶體不需再使用 但 卻無法被釋放 & 歸還給 程式的現象
對應用程式的影響
容易使得應用程式發生記憶體溢出,即 <code>OOM</code>
記憶體溢出 簡介:![]()
Android性能優化:這是一份全面&詳細的記憶體優化指南Android性能優化:這是一份全面&詳細的記憶體優化指南前言目錄1. 定義2. 作用3. 儲備知識:Android 記憶體管理機制4. 常見的記憶體問題 & 優化方案5. 輔助記憶體優化的分析工具6. 總結請幫頂 / 評論點贊!因為你的鼓勵是我寫作的最大動力!
發生記憶體洩露的本質原因
常見記憶體洩露原因
集合類
<code>Static</code>關鍵字修飾的成員變量
非靜态内部類 / 匿名類
資源對象使用後未關閉
優化方案
優化原因
即 為什麼要優化圖檔<code>Bitmap</code>資源,具體如下圖:
優化方向
主要 從 以下方面優化圖檔<code>Bitmap</code>資源的使用 & 記憶體管理
具體優化方案
下面,我将詳細講解每個優化方向的具體優化方案
盡量避免頻繁建立大量、臨時的小對象
代碼本身的品質(如 資料結構、資料類型等) & 數量(代碼量的大小)可能會導緻大量的記憶體問題,如占用記憶體大、記憶體使用率低等
主要從代碼總量、資料結構、資料類型、 & 資料對象引用 方面優化,具體如下
一些常見使用也可能引發大量的記憶體問題,下面我将詳細介紹。
注: 1. 還有1個記憶體優化的終極方案:調大 虛拟機<code>Dalvik</code>的堆記憶體大小 2. 即 在<code>AndroidManifest.xml</code>的<code>application</code>标簽中增加一個<code>android:largeHeap</code>屬性(值 = <code>true</code>),進而通知虛拟機 應用程式需更大的堆記憶體 3. 但不建議 & 不鼓勵該做法
此處,還有一些記憶體優化的小技巧希望告訴給大家
技巧1:擷取目前可使用的記憶體大小
調用 <code>ActivityManager.getMemoryClass()</code>方法可擷取目前應用可用的記憶體大小(機關 = 兆)
技巧2:擷取目前的記憶體使用情況
在應用生命周期的任何階段,調用 <code>onTrimMemory()</code>擷取應用程式 目前記憶體使用情況(以記憶體級别進行識别),可根據該方法傳回的記憶體緊張級别參數 來釋放記憶體
<code>Android 4.0</code> 後提供的一個API
技巧3:當視圖變為隐藏狀态時,則釋放記憶體
當使用者跳轉到不同的應用 & 視圖不再顯示時, 應釋放應用視圖所占的資源
注:此時釋放所占用的資源能顯著的提高系統的緩存處理容量 具體操作:實作目前<code>Activity</code>類的<code>onTrimMemory()</code>後,當使用者離開視圖時會得到通知;若得到傳回的參數 = <code>TRIM_MEMORY_UI_HIDDEN</code> 即代表視圖變為隐藏狀态,則可釋放視圖所占用的資源.
哪怕完全了解 記憶體的原因,但難免還是會出現人為難以發現的記憶體問題
下面将簡單介紹幾個主流的輔助分析記憶體優化的工具,分别是
<code>MAT(Memory Analysis Tools)</code>
<code>Heap Viewer</code>
<code>Allocation Tracker</code>
<code>Android Studio 的 Memory Monitor</code>
<code>LeakCanary</code>
定義:一個<code>Eclipse</code>的 <code>Java Heap</code> 記憶體分析工具
作用:檢視目前記憶體占用情況
通過分析 <code>Java</code> 程序的記憶體快照 <code>HPROF</code> 分析,快速計算出在記憶體中對象占用的大小,檢視哪些對象不能被垃圾收集器回收 & 可通過視圖直覺地檢視可能造成這種結果的對象
定義:一個的 <code>Java Heap</code> 記憶體分析工具
作用:檢視目前記憶體快照
可檢視 分别有哪些類型的資料在堆記憶體總 & 各種類型資料的占比情況
簡介:一個記憶體追蹤分析工具
作用:追蹤記憶體配置設定資訊,按順序排列
簡介:一個 <code>Android Studio</code> 自帶 的圖形化檢測記憶體工具
作用:跟蹤系統 / 應用的記憶體使用情況。核心功能如下
簡介:一個<code>square</code>出品的<code>Android</code>開源庫
作用:檢測記憶體洩露
至此,關于記憶體優化的所有知識講解完畢
本文主要講解記憶體優化的相關知識,總結如下:
下面我将繼續深入講解 <code>Android</code>中的性能優化知識,有興趣可以繼續關注