本系列博文 基因而前微信高級工程師張紹文專欄 《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系統上,最近筆者的蘋果手機也由於物理內存不足,卡頓現象明顯。
有些朋友在內存優化的時候,老是以爲內存佔有越低越好,實則否則。
假設手機的內存無限大,全部界面圖片都不須要回收,這時你切換界面就能達到秒加載的體驗.這種體驗天然是最好的。
固然內存無限大是不存在的,但也反應了一點,內存使用高的時候性能會更好。
咱們應該秉承着「用時分配,及時釋放」的理念來優化內存。
在說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內存測量
設備分級或者說內存分級
簡單來講就是高內存,新手機效果全開.老爺機便宜貨保留基本功能。
device-year-class是facebook開源的一個庫.該庫會根據手機的內存,CPU核心數和頻率
得出手機屬於那個年份。
而咱們也能夠根據這個年份來判斷,效果全開仍是保留基本功能。
補充部分:
一個空進程也會佔用10MB的內存,因此對於一些低端機就不要開太多進程了
安裝包中的代碼、資源、圖片以及 so 庫的體積,跟他們佔用的內存有很大關係。
因此apk優化仍是有必要的。
Bitmap優化
統一圖片庫,主要是爲了統一圖片的調用入口.內存不足的時候能夠下降圖片格式,選用更合理的縮放算法。
另一點,張老師在課中提到須要作圖片監控,通常爲了針對大圖片和重複圖片。(關於這方面,我也接觸的很少,就不誤導你們了。)
內存泄漏
內存泄漏主要分兩種狀況,一種是同一個對象泄漏,還有一種是每次都會泄露新的對象。
最後,給本身公衆號打個廣告,【碼農的嘮叨】聊技術,聊熱文,聊互聯網趣事,也發嘮叨