Android開發高手進階 -- 內存優化

微信內存優化詳談html

Android 官網的guidejava

官方註解android

如何減小體積web

內存優化須要理解的技術:數組

  • hook gc來避免gc引發的memory churn的技術
  • 常見的引發內存泄漏幾種狀況的解決
    • 靜態屬性持有 activity 或者 view 等
    • 內部類、匿名類持有activity或者view等外部類的引用
    • Handler 提交msg的是否一個匿名的runnable 持有外部的引用
    • Thread 和 timertask 因爲thread 和timertask 會另外啓動線程而線程在運行結束銷燬以前是當作gcroot的
    • 某些系統服務 好比sensormanager須要持有activity的的引用以做回調的
    • 資源未回收關閉 致使的問題
    • webview
  • 數據結構優化(arraymap等)
  • 更換序列化方案
  • view複用
  • object pool等優化方法
  • 內存相關的操做系統概念
  • Android虛擬機heap space的結構和allocator的執行原理

內存優化

爲何要優化內存,首先要下降應用的內存佔用,這樣有助於不被lmkiller 殺死,第二 提升應用的運行速度不會由於頻繁gc而變卡微信

內存泄漏的主要緣由,列舉以下:
  • 靜態變量:監聽器、廣播、webview等
  • 內部類:handler、timer、Thread等
  • 系統:dialog、輸入法、音頻、textline
內存泄漏的監控方案
  • LealCanary:使用弱應用檢查Activity的對象內存泄漏數據結構

  • 能夠經過 在activity destroy的時候手動釋放各類資源,來避免activity泄漏致使activity所持有的資源沒有被釋放app

  • Drawable d = iv.getDrawable();
    if (d != null) {
        d.setCallback(null);
    }        
    iv.setImageDrawable(null);
如何減小內存的佔用
  • 圖片:ide

    • 使用統一的圖片加載庫,方便修改加載方式
    • .9圖的修改 避免多餘的像素加載浪費
    • 圖片加載不超過 view的大小
    • bitmap不放在java堆中?
  • 監控本身的內存使用優化

    Runtime.getRuntime().maxMemory();  
    Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

    這樣獲取到當前本身的內存佔用,到達一個筏值的時候 釋放一些資源好比 glide的釋放模塊

  • 使用多進程,好比圖庫,好比webview所佔用的內存

  • large heap: application 節點之下 android:largeHeap = true

  • inBitmap: BitmapFactory.Option.inBitmap應用了這個option的image 將會使用同一個bitmap的地方

  • SparseArray:key一個數組 value一個數組 代替map

  • ArrayMap:key的hash 保存成一個數組,key-value相隔 保存成一個數組,先經過key的hash獲取到index 去讀第二個數組,若是找不到 說明 產生了碰撞

  • Protobuf:T-L-V ,varint byte 數組表示,能夠將一個較小的數用更低的位來代替 link

GC type
  • GC_CONCURRENT 對象大於348k的時候會觸發的gc 說明對象的複用不夠
  • GC_FOR_ALLOC 內存不足時會觸發
  • GC_EXPLICIT gc()
內存抖動

內存抖動,說明大量對象建立,大量對象被回收,頻繁gc 會卡

  • 字符串拼接優化
  • 減小沒必要要或不合理的對象
  • 使用合適的集合來替換雷士hashmap等集合

減小apk的包的體積將顯著減小內存的佔用


aapt crunch

在保存png的質量的同時縮減 png的大小

  • aapt crunch
  • aapt single-crunch
避免使用枚舉
相關文章
相關標籤/搜索