點贊關注,不再迷路,你的支持對我意義重大!
🔥 Hi,我是醜醜。本文 「Android 路線」| 導讀 —— 從零到無窮大 已收錄,這裏有 Android 進階成長路線筆記 & 博客,歡迎跟着彭醜醜一起成長。(聯繫方式在 GitHub)
目錄
前置知識
這篇文章的內容會涉及以下前置 / 相關知識,貼心的我都幫你準備好了,請享用~
Java 路線
虛擬機中的對象: Java 虛擬機 | 拿放大鏡看對象
垃圾回收: Java 虛擬機 | 垃圾回收機制
Java 內存分配: Java 虛擬機 | 內存分配模型
Android 路線
程序執行: Android 虛擬機 | 從類加載到程序執行
內存指標: Android | 內存指標與測量方法
Android 垃圾回收: 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的橋樑
參考資料
- 《Android 內存優化雜談》 —— 張紹文 著
- 《Android 開發高手課 · 內存優化(上)》《下》 —— 張紹文著
- 《深入探索 Android 內存優化(煉獄級別 - 上)》《下》 —— JsonChao(平安)著
- 《必知必會 | Android 性能優化的方面方面都在這兒》 —— 鴻洋(懂車帝)著
- 《實踐 App 內存優化:如何有序地做內存分析與優化》 —— 舒大飛(攜程)著
- 《Android 內存優化之 OOM》 —— 胡凱 著 (多篇)
- 《Android 內存分析命令》 —— Gityuan(字節跳動)著
- 《Linux 內存管理》 —— Gityuan(字節跳動)著
https://developer.android.google.cn/topic/performance/memory-management
創作不易,你的「三連」是醜醜最大的動力,我們下次見!