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

2022-01-01 終端研發部

關注並回復「1024」,加入技術交流群,致力於技術開發!

最近有想換工作的同學們,可參考《5月技術崗位內推|RN開發招聘啦》,再往下看,一篇關於性能優化的好文章,很值得去學習。

前言

在 Android開發中,性能優化策略十分重要

本文主要講解性能優化中的內存優化,希望你們會喜歡

目錄

1. 定義

優化處理 應用程式的內存使用、空間佔用

2. 作用

避免因不正確使用內存 & 缺乏管理,從而出現 內存洩露(ML)、內存溢出(OOM)、內存空間佔用過大 等問題,最終導致應用程式崩潰(Crash)

3. 儲備知識:Android 內存管理機制3.1 簡介

下面,將針對回收 進程、對象 、變量的內存分配 & 回收進行詳細講解

3.2 針對進程的內存策略a. 內存分配策略

由 ActivityManagerService 集中管理 所有進程的內存分配

b. 內存回收策略

Android將進程分為5個優先等級,具體如下:

ActivityManagerService 對 所有進程進行評分(評分存放在變量adj中)

更新評分到Linux 內核

由Linux 內核完成真正的內存回收

此處僅總結流程,這其中的過程複雜,有興趣的讀者可研究系統源碼ActivityManagerService.java

3.3 針對對象、變量的內存策略

下面,將詳細講解內存分配 & 內存釋放策略

a. 內存分配策略

註:用1個實例講解 內存分配

public class Sample {    
   
   int s1 = 0;
   Sample mSample1 = new Sample();   

   
   
   public void method() {        
       int s2 = 0;
       Sample mSample2 = new Sample();
   }
}
   
   
   
   Sample mSample3 = new Sample();

b. 內存釋放策略

由於靜態分配不需釋放、棧式分配僅 通過幀棧自動出、入棧,較簡單,故不詳細描述

4. 常見的內存問題 & 優化方案

內存洩露

內存抖動

圖片Bitmap相關

代碼質量 & 數量

日常不正確使用

下面,我將詳細分析每項的內存問題 & 給出優化方案

4.1 內存洩露

內存溢出 簡介:

集合類

Static關鍵字修飾的成員變量

非靜態內部類 / 匿名類

資源對象使用後未關閉

優化方案
具體請看文章:Android性能優化:手把手帶你全面了解 內存洩露 & 解決方案

4.2 圖片資源Bitmap相關

關於更加具體的介紹,請看文章:Android性能優化:那些關於Bitmap優化的小事

4.3 內存抖動

4.4 代碼質量 & 數量

4.5 常見使用

註:

還有1個內存優化的終極方案:調大 虛擬機Dalvik的堆內存大小

即 在AndroidManifest.xml的application標籤中增加一個android:largeHeap屬性(值 = true),從而通知虛擬機 應用程式需更大的堆內存

但不建議 & 不鼓勵該做法

4.6 額外小技巧

此處,還有一些內存優化的小技巧希望告訴給大家

Android 4.0 後提供的一個API

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

具體操作:實現當前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)

通過分析 Java 進程的內存快照 HPROF 分析,快速計算出在內存中對象佔用的大小,查看哪些對象不能被垃圾收集器回收 & 可通過視圖直觀地查看可能造成這種結果的對象

5.2 Heap Viewer

定義:一個的 Java Heap 內存分析工具

作用:查看當前內存快照

可查看 分別有哪些類型的數據在堆內存總 & 各種類型數據的佔比情況

5.3 Allocation Tracker5.4 Memory Monitor

5.5 LeakCanary

至此,關於內存優化的所有知識講解完畢

6. 總結

閱讀更多

相信自己,沒有做不到的,只有想不到的

在這裡獲得的不僅僅是技術!

相關焦點

  • Android 布局優化真的難,從入門到放棄
    前言Android的繪製優化其實可以分為兩個部分,即布局(UI)優化和卡頓優化,而布局優化的核心問題就是要解決因布局渲染性能不佳而導致應用卡頓的問題,所以它可以認為是卡頓優化的一個子集。本文主要包括以下內容:1.為什麼要進行布局優化及android繪製,布局加載原理。
  • 性能優化測試中的相關名詞
    當一個APP或遊戲各種功能越來越多時,性能優化的重要性就不言而喻了,況且現在APP或遊戲的功能逐漸趨同,提升用戶體驗已從產品設計本身轉到了APP或遊戲的流暢性上,這也讓越來越多的開發者更加關注性能優化與測試。
  • 系統架構性能優化思路
    比如常用的iostat,ps,sar,top,vmstat等,這些工具可以對CPU,內存,JVM,磁碟IO等進行性能監控和分析,以發現真正的性能問題在哪裡。比如我們常說的內存使用率持續告警,你就必須發現是高並發調用導致,還是JVM內存洩漏導致,還是本身由於磁碟IO瓶頸導致。
  • 愛奇藝Android客戶端啟動優化與分析!
    從啟動的三個階段,我們可以看出,啟動啟動時間的長短,決定因素在於,主線程中所做事情消耗的時間的多少,所以,我們的優化工作主要集中在,排查主線程中耗時性的工作,並進行合理的優化。Android手機,系統的資源是有限的,過多的異步線程,會搶佔CPU,導致主線程執行時間片間隔增大。同樣的,內存消耗狀態,GC頻率,也會影響啟動的時間。
  • 淺析網際網路產品的性能優化
    作為產品經理,要對所負責產品的整體用戶體驗負責,產品的性能優化是很重要的一個環節,為了避免用戶在使用產品過程中出現卡頓、加載緩慢、崩潰等性能問題,同時也為了在安排性能優化工作時做到心中有數,我們有必要加深一下對性能優化的理解
  • PHP7每次更新與發布,都注重性能的優化
    此文件可用於預加載其他文件,或通過 opcache_compile_file() 函數;在伺服器啟動的時候,將某些文件永久讀取到內存中,之後的請求即可直接從這內存中讀取。利用這個功能,能夠將框架,或者是類庫預加載到內存中,以進一步提高性能,在ZF框架的測試中,開啟opcache.preload後性能提升30%到50%。其實不難發現,過去十年網際網路江湖風雲變幻。但無論技術如何迭代,網際網路界都有一個亙古不變的追求——性能優化、高並發。
  • 7600字帶你學會 Redis 性能優化點,建議收藏!
    那麼,針對 Redis 服務,我們能做哪些性能優化呢?或者說,應該避免哪些性能浪費呢?Redis 性能的基本面在討論優化之前,我們需要知道,Redis 服務本身就有一些特性,比如單線程運行。除非修改 Redis 的原始碼,不然這些特性,就是我們思考性能優化的基本面。
  • 分步驟詳細解說:H5性能優化方案
    H5性能優化意義對於一個H5的產品,功能無疑很重要,但是性能同樣是用戶體驗中不可或缺的一環。原本H5的渲染性能就不及native的app,如果不把性能優化做起來,將極大地影響用戶使用產品的積極性。獲得無線鏈路後,會進行網絡附著、加密、鑑權,核心網絡會檢查你是不是可以連接在這個網絡上,是否開通套餐,是不是漫遊等。核心網絡有SGSN和 GGSN,在這一步完成無線網絡協議和有線乙太網的協議轉換。再下一步,核心網絡會給你進行APN選擇、IP分配、啟動計費。
  • ARM高效C編程和優化--編譯器,內存和Cache優化以及功耗管理
    這意味著編譯器必須做假設通過任何指針的寫都可能改變任何一個內存的地址,這對編譯器的優化有非常嚴重的影響。其他的例子就是編譯器必須假定全局數據是易揮發的(volatile),在其他函數內,循環計數也是可能會隨時被修改的。好消息是在大多數情況下,程式設計師可以很容易給編譯器提供額外的信息來幫助編譯器優化。
  • VS2019 16.2: 新版本對遊戲性能的優化
    朋友們,又優化了一點點:%2~%3。遊戲可以說是提升Windows市佔率的重量級推手,此次的16.2的版本中,開發團隊進一步的對遊戲運行時性能進行了優化,如開頭所說的,對比之前16.0版本,性能提升了2~3%,雖說不是很多,但是也是值得誇讚一番:你家孩子之前考了95分,這次通過努力,考了98分,是否是一件值得誇讚的事情?
  • 從Context源碼實現談React性能優化
    shouldComponentUpdate、React.memo、PureComponent等性能優化手段的實現我會儘量將文章寫的通俗易懂。但是,要完全理解文章內容,需要你掌握這些前置知識: Fiber架構的大體工作流程 優先級與更新在React源碼中的意義組件render的時機Context的實現與組件的render息息相關。在講解其實現前,我們先來了解render的時機。
  • 上古捲軸5天際 性能優化補丁ENBoost下載
    補丁介紹:   ENB官網推出的新功能ENBoost,通過優化遊戲的內存使用,   大幅減少遊戲的內存佔用以達到緩解當遊戲內存佔用超過3.1G後跳出的BUG,同時推出了全屏窗口化的功能
  • Unity性能優化 — 動畫模塊
    我們曾在四年前對於Unity的主流模塊的性能優化知識點逐一做過講解,俗稱「小白版」。
  • 視頻跟蹤算法在Davinci SOC上的實現與優化
    經過算法優化和編程優化,跟蹤算法可以在DSP核上實時跟蹤128×128像素的目標。同時,ARM核並行負責視頻採集,顯示,算法控制,網絡傳送等任務。測試結果表明,我們的系統可以在目標形變、部分或全部遮擋、背景幹擾等情況下也具有較好的性能。
  • 工程之道,深度學習推理性能業界最佳優化實踐
    深度學習技術能否最終落地為產品,細粒度滿足不同場景需求,深度學習框架的推理性能優化是一個關鍵變量。針對不同硬體設備對性能的苛刻要求,業界一般做法是開發一套推理專用框架,不足是造成了訓練與推理的分裂。MegEngine(中文名:天元)「訓練推理一體化」的獨特範式,可以實現訓練與推理的精確等價性,避免轉換可能帶來的精度損失。
  • 幾個Ceph 性能優化的新方法和思路
    本文就這些演講中提到的 Ceph性能優化方面的知識和方法,試著就自己的理解做個總結。0. 常規的 Ceph 性能優化方法(1). 硬體層面硬體規劃:CPU、內存、網絡SSD選擇:使用 SSD 作為日誌存儲BIOS設置:打開超線程(HT)、關閉節能、關閉 NUMA 等(2).
  • Oppo百萬級高並發mongodb集群性能數十倍提升優化實踐
    2.軟體優化在不增加伺服器資源的情況下,首先做了如下軟體層面的優化,並取得了理想的數倍性能提升:業務層面優化Mongodb配置優化存儲引擎優化2.1 業務層面優化該集群總文檔近百億條,每條文檔記錄默認保存三天,業務隨機散列數據到三天後任意時間點隨機過期淘汰
  • Win10優化指南:別再說電腦太卡了 這些優化你都做了嗎?
    其實很多情況下Windows系統都可以通過簡單的優化措施來提升使用體驗,下面這份Win10優化指南,旨在拯救你卡頓的電腦,幫助大家了解系統卡頓的原因,然後對症下藥,調整好系統本身設置和使用一些優秀的優化工具,提升Win10流暢度。
  • 「聲子液體」優化熱電性能
    中科院上海矽酸鹽所研究員史迅、陳立東、張文清、許鍅鍅與美國加州理工大學等機構的學者合作,提出在固態材料中引入具有局域「液態」特徵的離子來降低熱導率和優化熱電性能
  • 幾個Ceph 性能優化的新方法和思路
    本文就這些演講中提到的 Ceph性能優化方面的知識和方法,試著就自己的理解做個總結。0. 常規的 Ceph 性能優化方法(1). 硬體層面硬體規劃:CPU、內存、網絡SSD選擇:使用 SSD 作為日誌存儲BIOS設置:打開超線程(HT)、關閉節能、關閉 NUMA 等(2).