今日限免課程:《Android性能優化詳解—內存篇》
(滑動查看課程目錄)
課程免費僅限今日,24小時後恢復原價
若想直接學習課程,掃碼學習
(以下內容為正文)
作者丨Harvey_Specter在 Android開發中,性能優化策略十分重要
本文主要講解性能優化中的內存優化,希望你們會喜歡
優化處理 應用程式的內存使用、空間佔用
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
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();
對象 / 變量的內存釋放 由Java垃圾回收器(GC) / 幀棧 負責
此處主要講解對象分配(即堆式分配)的內存釋放策略 = Java垃圾回收器(GC)
由於靜態分配不需釋放、棧式分配僅 通過幀棧自動出、入棧,較簡單,故不詳細描述
Java垃圾回收器(GC)的內存釋放 = 垃圾回收算法,主要包括:
具體介紹如下
常見的內存問題如下
內存洩露
內存抖動
圖片Bitmap相關
代碼質量 & 數量
日常不正確使用
下面,我將詳細分析每項的內存問題 & 給出優化方案
簡介
即 ML (Memory Leak),指 程序在申請內存後,當該內存不需再使用 但 卻無法被釋放 & 歸還給 程序的現象
對應用程式的影響
容易使得應用程式發生內存溢出,即 OOM
內存溢出 簡介:
發生內存洩露的本質原因
常見內存洩露原因
集合類
Static關鍵字修飾的成員變量
非靜態內部類 / 匿名類
資源對象使用後未關閉
優化原因
即 為什麼要優化圖片Bitmap資源,具體如下圖:
優化方向
主要 從 以下方面優化圖片Bitmap資源的使用 & 內存管理
具體優化方案
下面,我將詳細講解每個優化方向的具體優化方案
簡介
優化方案
儘量避免頻繁創建大量、臨時的小對象
優化原因
代碼本身的質量(如 數據結構、數據類型等) & 數量(代碼量的大小)可能會導致大量的內存問題,如佔用內存大、內存利用率低等
優化方案
主要從代碼總量、數據結構、數據類型、 & 數據對象引用 方面優化,具體如下
優化原因
一些常見使用也可能引發大量的內存問題,下面我將詳細介紹。
優化方案
還有1個內存優化的終極方案:調大 虛擬機Dalvik的堆內存大小
即 在AndroidManifest.xml的application標籤中增加一個android:largeHeap屬性(值 = true),從而通知虛擬機 應用程式需更大的堆內存,但不建議 & 不鼓勵該做法
此處,還有一些內存優化的小技巧希望告訴給大家
技巧1:獲取當前可使用的內存大小
調用 ActivityManager.getMemoryClass()方法可獲取當前應用可用的內存大小(單位 = 兆)
技巧2:獲取當前的內存使用情況
在應用生命周期的任何階段,調用 onTrimMemory()獲取應用程式 當前內存使用情況(以內存級別進行識別),可根據該方法返回的內存緊張級別參數 來釋放內存
Android 4.0 後提供的一個API
技巧3:當視圖變為隱藏狀態時,則釋放內存
當用戶跳轉到不同的應用 & 視圖不再顯示時, 應釋放應用視圖所佔的資源
1.註:此時釋放所佔用的資源能顯著的提高系統的緩存處理容量
2.具體操作:實現當前Activity類的onTrimMemory()後,當用戶離開視圖時會得到通知;若得到返回的參數 = TRIM_MEMORY_UI_HIDDEN 即代表視圖變為隱藏狀態,則可釋放視圖所佔用的資源.
哪怕完全了解 內存的原因,但難免還是會出現人為難以發現的內存問題
下面將簡單介紹幾個主流的輔助分析內存優化的工具,分別是
MAT(Memory Analysis Tools)
Heap Viewer
Allocation Tracker
Android Studio 的 Memory Monitor
LeakCanary
具體使用看內存洩漏那篇文章。
6. 總結本文主要講解內存優化的相關知識,總結如下:
很多APP開發者,不在意一點一滴的內存洩漏。等到項目做大了,內存洩漏越來越多了,因內存洩漏而出現不可意料的問題或者內存警告,甚至APP閃退。這個時候他們就不得不去解決內存洩漏的問題了。
而這時不僅浪費內存資源,增加CPU不必要的負擔,並且內存洩漏的頁面超乎你的想像,非常多,這樣會大大增加了開發成本。及早的了解內存,優化內存時進階必學。
(滑動查看課程目錄)
課程的設計邏輯
本課程是《Android性能優化-UI篇》的姊妹篇,介紹了Android內存管理原理,常用內存優化工具的使用,常用的內存優化技巧以及圖片的優化處理。
哪些人適合學習?
具備一定Android開發基礎的人
Android開發人
極客學院每天會針對性的推出限免課程,只需2步,輕鬆開始學習:掃描下方二維碼
註冊極客學院帳號,開啟學習之旅