Android性能優化:帶你全面實現內存優化

2021-02-14 極客學院

今日限免課程:《Android性能優化詳解—內存篇》

(滑動查看課程目錄)

課程免費僅限今日,24小時後恢復原價

若想直接學習課程,掃碼學習

(以下內容為正文)

作者丨Harvey_Specter
https://www.jianshu.com/p/42516966a6ff前言

在 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關鍵字修飾的成員變量

非靜態內部類 / 匿名類

資源對象使用後未關閉



4.2 圖片資源Bitmap相關

優化原因


即 為什麼要優化圖片Bitmap資源,具體如下圖:

優化方向


主要 從 以下方面優化圖片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:當視圖變為隱藏狀態時,則釋放內存


當用戶跳轉到不同的應用 & 視圖不再顯示時, 應釋放應用視圖所佔的資源

1.註:此時釋放所佔用的資源能顯著的提高系統的緩存處理容量


2.具體操作:實現當前Activity類的onTrimMemory()後,當用戶離開視圖時會得到通知;若得到返回的參數 = TRIM_MEMORY_UI_HIDDEN 即代表視圖變為隱藏狀態,則可釋放視圖所佔用的資源.


5. 輔助內存優化的分析工具

哪怕完全了解 內存的原因,但難免還是會出現人為難以發現的內存問題

下面將簡單介紹幾個主流的輔助分析內存優化的工具,分別是

MAT(Memory Analysis Tools)

Heap Viewer

Allocation Tracker

Android Studio 的 Memory Monitor

LeakCanary

具體使用看內存洩漏那篇文章。

6. 總結

本文主要講解內存優化的相關知識,總結如下:

很多APP開發者,不在意一點一滴的內存洩漏。等到項目做大了,內存洩漏越來越多了,因內存洩漏而出現不可意料的問題或者內存警告,甚至APP閃退。這個時候他們就不得不去解決內存洩漏的問題了。

而這時不僅浪費內存資源,增加CPU不必要的負擔,並且內存洩漏的頁面超乎你的想像,非常多,這樣會大大增加了開發成本。及早的了解內存,優化內存時進階必學。

今日推薦的免費課程是《Android性能優化詳解—內存篇》來告訴你

(滑動查看課程目錄)

課程的設計邏輯

本課程是《Android性能優化-UI篇》的姊妹篇,介紹了Android內存管理原理,常用內存優化工具的使用,常用的內存優化技巧以及圖片的優化處理。

哪些人適合學習?

具備一定Android開發基礎的人

Android開發人

極客學院每天會針對性的推出限免課程,只需2步,輕鬆開始學習:

掃描下方二維碼

註冊極客學院帳號,開啟學習之旅

相關焦點

  • Android性能優化:手把手帶你全面實現內存優化
    最近有想換工作的同學們,可參考《5月技術崗位內推|RN開發招聘啦》,再往下看,一篇關於性能優化的好文章,很值得去學習。前言在 Android開發中,性能優化策略十分重要本文主要講解性能優化中的內存優化,希望你們會喜歡目錄
  • Android性能優化--內存優化
    本文來自Dotry投稿,連結:https://www.jianshu.com/p/38b627adaecd上一篇文章關於Android性能優化--啟動優化探討了啟動優化相關的知識點,在本篇將介紹內存優化的相關優化。
  • 最全的Android內存優化技巧
    本文主要介紹性能優化的一些手段,但是為了便於理解以及融會貫通,建議先了解Android內存管理機制,本文將從四個角度來介紹內存優化技巧減小對象的內存佔用儘量減少新分配出來的對象佔用內存的大小,使用更加輕量的對象1.
  • android內存優化總結
    ※1、追查內存的方法使用lintlint會提醒你很多使用不得當的地方,主要會集中再這麼幾個地方:(1)handler等長周期匿名內部類的使用,具體原因下文表(2)數據結構的優化,hashmap向稀疏數組的優化(3)未使用的圖片資源當然lint
  • 幾乎是史上最全最實用的Android性能全面分析與優化方案研究
    藉助性能優化工具分析解決問題性能優化指標性能問題分類1、渲染問題: 過度繪製、布局冗雜2、內存問題: 內存浪費(內存管理)、內存洩漏3、功耗問題: 耗電性能優化原則和方法1、性能優化原則堅持性能測試(開發和測試同學的測試方法略有不同):不要憑感覺去檢測性能問題、評估性能優化的效果,應該保持足夠多的測量,用數據說話(主要針對測試同學)。
  • Android性能優化總結
    網絡:頻繁的網絡訪問會導致耗電和影響應用的性能;網絡交互數據大小會影響網絡傳輸的效率;5. 程序執行效率:糟糕的代碼會嚴重影響程序的運行效率,UI線程過多的任務會阻塞應用的正常運行,長時間持有某個對象會導致潛在的內存洩露,頻繁的IO操作、網絡操作而不用緩存會嚴重影響程序的運行效率。
  • Android性能優化典範
    摘要:Google在Udacity上的《Android性能優化》在線課程詳細介紹了該如何優化性能,這些課程是Google之前在Youtube上發布的Android性能優化典範專題課程的細化與補充。本文是對渲染、運算、內存、電量四個篇章的學習筆記。
  • 高頻面試點:Android性能優化之內存優化(上篇)
    眾所周知,內存優化可以說是性能優化中最重要的優化點之一,可以說,如果你沒有掌握系統的內存優化方案,就不能說你對Android的性能優化有過多的研究與探索。本篇,筆者將帶領大家一起來系統地學習Android中的內存優化。
  • Android 性能優化之內存洩漏,使用MAT&LeakCanary解決問題
    本文較長,閱讀大約5分鐘App進行到最終的測試的時候,往往會出現一些性能上,以及內存上的問題,需要優化,這也是一個Android高級工程師所需要了解並且掌握的知識點
  • Android性能優化典範(一)
    11) Performance Cost of Memory Leaks雖然Java有自動回收的機制,可是這不意味著Java中不存在內存洩漏的問題,而內存洩漏會很容易導致嚴重的性能問題。內存洩漏指的是那些程序不再使用的對象無法被GC識別,這樣就導致這個對象一直留在內存當中,佔用了寶貴的內存空間。
  • Google 發布 Android 性能優化典範 - OSCHINA - 中文開源技術交流...
    課程專題不僅僅介紹了Android系統中有關性能問題的底層工作原理,同時也介紹了如何通過工具來找出性能問題以及提升性能的建議。主要從三個方面展開,Android的渲染機制,內存與GC,電量優化。下面是對這些問題和建議的總結梳理。0)Render Performance大多數用戶感知到的卡頓等性能問題的最主要根源都是因為渲染性能。
  • android 復用 布局優化專題及常見問題 - CSDN
    2)標籤若指定了ID屬性,而你的layout也定義了ID,則你的layout的ID會被覆蓋 3)在include標籤中所有的android:layout_*都是有效的,前提是必須要寫layout_width和layout_height兩個屬性。
  • Google《Android性能優化》學習筆記
    Google近期在Udacity上發布了Android性能優化的在線課程,分別從渲染,運算與內存,電量幾個方面介紹了如何去優化性能,這些課程是Google之前在Youtube上發布的Android性能優化典範專題課程的細化與補充。
  • 性能優化之PHP優化
    在我們平常寫代碼的過程中,除了資料庫的優化,針對與文件的優化,我們還需要對PHP執行優化,當然對於老司機來說,這都是毛毛雨咯~但是畢竟有新手嘛,於是,我整理這麼一片文章。(未完待續...)性能優化之PHP優化(一):PHP結構1.字符串
  • 吹爆系列:深入探索Android穩定性優化
    為了能夠全面地了解Android的性能優化知識體系,我們先看看我總結的下面這張圖,如下所示:要做好應用的性能優化,我們需要建立一套成體系的性能優化方案,這套方案被業界稱為 APM(Application Performance Manange),為了讓大家快速了解APM涉及的相關知識,筆者已經將其總結成圖,如下所示:
  • Android一些你需要知道的布局優化技巧
    唯鹿的博客地址:http://blog.csdn.net/qq_17766199今天分享一些layout布局書寫中的一些技巧,希望看過之後你也一樣可以寫出性價比高的布局。我個人的目標是用最少的View寫出一樣效果的布局。因為我相信View的數量減少伴隨著的就是層級的減少。從而達到結構清晰,渲染速度快的效果。順著這個邏輯,我將優化分為重用、合併、按需載入。
  • 性能優化測試中的相關名詞
    當一個APP或遊戲各種功能越來越多時,性能優化的重要性就不言而喻了,況且現在APP或遊戲的功能逐漸趨同,提升用戶體驗已從產品設計本身轉到了APP或遊戲的流暢性上,這也讓越來越多的開發者更加關注性能優化與測試。
  • QQ音樂Android客戶端Web頁面通用性能優化實踐
    目標基於本次優化的背景,本次優化提出以下兩方面的目標:增強通用性、減少前端改造成本。二、指標設計在展開優化思路和實施的同時,需要建立衡量優化效果的性能指標。1. 客戶端現有性能指標數據接下來基於客戶端內 Web 頁面加載過程,描述客戶端現有性能指標代表的時機。
  • ​吹爆系列:深入探索 Android 包體積優化
    在 Android 性能優化的知識體系當中,包體積優化一直被排在優先級比較低的位置,從而導致很多開發同學對自身應用的大小並不重視。但是,這樣 別的平臺使用時性能上就會有所損耗,失去了對特定平臺的優化。對於應用包體積的監控,也應該和內存監控一樣,去作為正式版本的發布流程中的一環,並且應該 儘量地去實現自動化與平臺化。
  • 系統架構性能優化思路
    比如常用的iostat,ps,sar,top,vmstat等,這些工具可以對CPU,內存,JVM,磁碟IO等進行性能監控和分析,以發現真正的性能問題在哪裡。比如我們常說的內存使用率持續告警,你就必須發現是高並發調用導致,還是JVM內存洩漏導致,還是本身由於磁碟IO瓶頸導致。