讀書筆記2-內存優化篇

本系列博文 基因而前微信高級工程師張紹文專欄 《Android開發高手課》的讀書筆記。java

文章所寫內容是本人讀完的感悟,須要原文的朋友請自行購買。android

內存優化篇

寫在開頭.git

越讀張老師的課,越會發現有不少知識徹底沒有接觸過,課程的留言下方也有不少人反應說課程有點深。github

秉持着"你們好纔是真的好"的理念,以後的筆記都會記錄一些你們容易理解的內容,算法

至於有些設計比較深的內容,一筆帶過。有興趣的朋友能夠自行了解。shell

手機運行內存(RAM)做爲 App 運行過程當中臨時性數據暫時存儲的內存介質,由於體積和功耗的緣由,沒有直接採用PC上DDR的架構,而是該用LPDDR,能夠理解爲Lower PowerDDR.性能優化

內存不足所帶來的問題

1.**異常:**其中異常包括OOM、內存分配失敗這些崩潰,也包括由於總體內存不足致使應用被殺死、設備重啓等問題。微信

2.**卡頓:**Java 內存不足會致使頻繁 GC,而GC便會引發卡頓,這個問題在Dalvik 虛擬機比較明顯,而ART虛擬機在內存管理跟回收策略上都作大量優化,因此卡頓現象沒那麼嚴重。架構

若是想要測試GC的性能,能夠經過adb命令獲取ANR日誌.性能

//adb 命令
adb shell kill -S QUIT PID
adb pull /data/anr/traces.txt

//ANR日誌
sticky concurrent mark sweep paused:	Sum: 5.491ms 99% C.I. 1.464ms-2.133ms Avg: 1.830ms Max: 2.133ms     // GC 暫停時間

Total time spent in GC: 502.251ms     // GC 總耗時
Mean GC size throughput: 92MB/s       // GC 吞吐量
Mean GC object throughput: 1.54702e+06 objects/s 

複製代碼

除了頻繁GC會形成卡頓以外,物理內存不足時系統會觸發low memory killer 機制,進而影響手機性能。

關於物理內存不足引發的卡頓現象,不僅發生在android系統上,最近筆者的蘋果手機也由於物理內存不足,卡頓現象明顯。

內存優化的兩大誤區

1.內存佔用越少越好

有些朋友在內存優化的時候,老是以爲內存佔有越低越好,實則否則。

假設手機的內存無限大,全部界面圖片都不須要回收,這時你切換界面就能達到秒加載的體驗.這種體驗天然是最好的。

固然內存無限大是不存在的,但也反應了一點,內存使用高的時候性能會更好。

咱們應該秉承着「用時分配,及時釋放」的理念來優化內存。

2.Native內存不用管

在說Native內存以前,先來談一談常見的OOM。

Android系統會給每個進程分配一個最大java堆.若是該進程申請的空間超過這個閾值時,就會拋出OOM異常。

因此程序發生OMM並不表示RAM(物理內存)不足

這樣設計的目的是爲了讓Android系統能同時讓比較多的進程常駐內存(RAM)。

Native內存起到什麼做用?

拿常見的例子來講明,你們都知道android的內存大戶是bitmap,OOM出現也可能是由於圖片。

  • 在Android3.0以前,Bitmap對象放在java堆中,具體的像素數據放在Native中,這樣作OOM的概率小了,但在圖片回收的時候,不必定能及時釋放Native內存中的圖片像素數據。

  • 因而在Android3.0~Android7.0期間,將Bitmap 對象和像素數據統一放到 Java 堆中.這樣作資源是能及時回收了,可是OOM的問題又出現了。

  • Android8.0系統又以爲將Bitmap像素數據放回到Native中,只是這時多了一個NativeAllocationRegistry來幫助Native內存的回收。

那麼8.0系統以後的手機性能優化對圖片部分是否是就沒有那麼必要了呢?畢竟圖片像素數據放入到Native以後就不太會引發OOM。

固然也不是,雖然說OOM的概率小了,但沒有回收的圖片依舊佔用着RAM,當RAM不夠的時候,手機會開啓

low memory killer 殺戮模式,後臺,桌面,服務,前臺,直至手機重啓。

因此該回收的內存仍是得回收的,若是由於手機內存不足致使手機卡頓,刪點圖片,騰出點空間仍是有效果的。

java內存和Native內存的測量方法

java內存測量

  • Allocation Tracker
  • MAT

Native內存測量

如何着手內存優化

  1. 設備分級或者說內存分級

    簡單來講就是高內存,新手機效果全開.老爺機便宜貨保留基本功能。

    device-year-class是facebook開源的一個庫.該庫會根據手機的內存,CPU核心數和頻率

    得出手機屬於那個年份。

    而咱們也能夠根據這個年份來判斷,效果全開仍是保留基本功能。

    補充部分:

    • 一個空進程也會佔用10MB的內存,因此對於一些低端機就不要開太多進程了

    • 安裝包中的代碼、資源、圖片以及 so 庫的體積,跟他們佔用的內存有很大關係。

      因此apk優化仍是有必要的。

  2. Bitmap優化

    統一圖片庫,主要是爲了統一圖片的調用入口.內存不足的時候能夠下降圖片格式,選用更合理的縮放算法。

    另一點,張老師在課中提到須要作圖片監控,通常爲了針對大圖片和重複圖片。(關於這方面,我也接觸的很少,就不誤導你們了。)

  3. 內存泄漏

    內存泄漏主要分兩種狀況,一種是同一個對象泄漏,還有一種是每次都會泄露新的對象。

    最後,給本身公衆號打個廣告,【碼農的嘮叨】聊技術,聊熱文,聊互聯網趣事,也發嘮叨

    qrcode_for_gh_5febf245550e_258
相關文章
相關標籤/搜索