Android | 如何搭建內存優化體系(築基) 目錄 前置知識 1. 重新認識內存 2. Android 內存指標 2. MAT

點贊關注,不再迷路,你的支持對我意義重大!

🔥 Hi,我是醜醜。本文 「Android 路線」| 導讀 —— 從零到無窮大 已收錄,這裏有 Android 進階成長路線筆記 & 博客,歡迎跟着彭醜醜一起成長。(聯繫方式在 GitHub)


目錄


前置知識

這篇文章的內容會涉及以下前置 / 相關知識,貼心的我都幫你準備好了,請享用~

Java 路線

Android 路線

adj 進程優先級 (high)
Linux內核OOM killer機制:https://juejin.cn/post/6844903878178111502

  • App 內存組成 & 限制(如何查看、監控)
  • Dalvik & ART 內存分配與垃圾回收

1. 重新認識內存

1.1 什麼是內存?

現代 Android 手機內存分爲 運行時內存 RAM & 非運行時內存 ROM

  • 運行內存 RAM: 相當於 PC 中的內存條,是暫存 App 臨時數據的存儲介質。RAM 越大手機就能運行更多程序,且更佳流暢。考慮到體積和功耗,手機 RAM 不會使用 PC 中的 DDR RAM ,而是採用 LPDDR RAM(低功耗雙倍數據速率內存);

  • 非運行內存 ROM: 相當於 PC 中的磁盤,是持久化存儲數據的存儲介質。ROM 越大手機能存儲更多數據。

提示:今天我們討論的內存優化指 “運行內存優化”,而 “非運行內存優化” 我們將在 “存儲優化” 專題中討論。

1.2 內存優化的維度

分別針對上面提到的 RAM 和 ROM 兩種內存,Android 內存優化是分爲兩方面的工作:

  • 優化 RAM: 降低程序運行內存佔用,防止程序發生 OOM,以及降低被 LMK 機制殺死的概率。同時不合理的內存使用會增大 GC 發生頻率,從而導致程序卡頓;

  • 優化包體積: Resource 資源、so 庫以及 Dex 文件都會佔用內存,包體積越大會佔用更多運行內存;

1.3 內存優化的誤區

對內存優化的錯誤認識需要注意規避,主要有:

  • 內存佔用越少越好?

內存優化不完全是追求於降低內存佔用,當系統內存較充足 / 機型較高端的時候,我們完全可以多使用一些內存來換取更好的體驗;而當系統內存不足 / 機型較低端的時候,我們應該更保守,做到 “用時分配,及時釋放”。

  • 本地(native)內存不用管?

本地內存是不受 Java 堆大小限制,例如 Android 8.0 就重新把 Bitmap 的圖片數據放在本地內存。但也不能濫用本地內存,主要原因是當系統物理內存不足時,LMK 機制也會開始殺進程,內存佔用越高越可能被殺死。

1.4 內存優化的意義

優化內存的意義可以歸結爲如下三點:

  • 1、防止程序發生 OOM,提高應用穩定性;
  • 2、減少 GC 頻率,降低卡頓;
  • 3、減少內存佔用,降低被 LMK 機制殺死的概率。

需要注意的是,發生 OOM 的代碼往往是 “壓死駱駝的最後一棵稻草” ,但不一定是導致 OOM 的主要代碼,完全可能只是剛好執行到這行代碼發生 OOM。

1.5 內存的主要問題

理解了內存優化的重要性,那麼內存優化到底要做什麼呢?

  • 內存抖動(memory thrashing)

主要表現爲內存波動圖形呈鋸齒張,伴隨着高頻率 GC,導致程序卡頓。這個問題在 Dalvik 虛擬機上會更加明顯,而 ART虛擬機在內存管理跟回收策略上都做了 大量優化,內存分配和GC效率相比提升了5~10倍,出現內存抖動的概率會小很多。

  • 內存泄漏(memory leak)

主要表現爲不再使用的無用對象無法被垃圾回收。這是因爲 Android 虛擬機採用可達性分析算法來判定垃圾對象,當無用對象被生命週期更長的 GC Root 引用時,就會導致無法判定爲垃圾對象而不會被回收,持續佔用內存。

  • 異常內存溢出(out of memory)

主要表現爲程序拋出 OutOfMemoryError 異常奔潰。這是因爲 Android 爲每個應用分配了最大堆內存,當

即OOM,OOM時會導致程序異常。Android設備出廠以後,java虛擬機對單個應用的最大內存分配就確定下來了,超出這個值就會OOM。單個應用可用的最大內存對應於 /system/build.prop 文件中的 dalvik.vm.heapgrowthlimit。
此外,除了因內存泄漏累積到一定程度導致OOM的情況以外,也有一次性申請很多內存,比如說 一次創建大的數組或者是載入大的文件如圖片的時候會導致OOM。而且,實際情況下 很多OOM就是因圖片處理不當 而產生的。

  • 內存分配異常

本文的着重點爲第一點,總結概述降低應用運行內存的技巧。在這裏我們不再細述PSS、USS等概念與Android應用的內存管理,如對這部分內容感興趣,可自行閱讀文末的參考文章。


2. Android 內存指標

  • MAT

2.

2.3 三大內存問題


MAT

重要概念

incoming references
outgoing references

內存指標

當前設備內存佔用情況 / 當前應用內存佔用情況

ViewRootImpl 是Activity與Window的橋樑


參考資料

https://developer.android.google.cn/topic/performance/memory-management


創作不易,你的「三連」是醜醜最大的動力,我們下次見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章