1. 程式人生 > >學習筆記(十)-記憶體優化

學習筆記(十)-記憶體優化

說實話,可能由於自己的水平不夠,老師講的有些東西自己並沒有聽懂,而且最近相當忙,又要寫這些筆記,所以有些東西描述不清楚請大家原諒。
在學習之前,先說一下垃圾回收這一概念吧,自己首次是在Java中聽說過的,但是由於java虛擬機器自帶垃圾回收機制,所以就沒有太多關注。但是學習C和C++在做一些複雜程式的時候想必肯定熟悉,因為C和C++是要自己人為釋放記憶體的。
Android Studio提供了三種工具幫助進行記憶體優化:

  • Memory Monitor
    Memory Monitor工具為監控工具,是一種發現型或者說監控性質的工具。
    在android studio的底部控制檯可以找到。然後點選Monitors 我們可以看到一個座標軸,橫座標記錄從採集開始點到目前已經過去的時間,縱座標是分配給App使用的記憶體總量,藍色區域表示已分配使用的的,灰色區域表示空閒未使用的。在座標軸的右邊可以看見具體數值。

    GC是垃圾回收的意思,我們可以從Memory monitor看到何時發生了GC event,當一個記憶體短時間內發生掉落,我們可以認為發生了GC操作。你也可以手動觸發GC,下圖中的小車子就是觸發GC的按鈕,一旦按下就會回收那些沒被引用的物件。
  • AllocationTracker
    同樣,我們也可以在相同位置的旁邊找到 AllocationTracker,它也可以幫助我們監視程式的執行,點選開始後,執行相關的android程式操作,然後完成操作後再次點選結束檢測,這樣我們就得到這一段時間內程式的執行狀態的資料。面板左上角是所有歷史資料檔案列表,後面是詳細資訊。而且會有兩個檢視方式的選項:
    • Group by Method:用方法來分類我們的記憶體分配
    • Group by Allocator:用記憶體分配器來分類我們的記憶體分配

不同的選項,顯示的資訊會不同;
除此之外,還有一個比較酷的就是統計按鈕;可以幫助我們統計相關資料;
這裡寫圖片描述

  • HeapDump和LeakCanary

    HeapDump得到的資料可以幫助我們檢查是否發生記憶體洩漏,點選dump java heap 這個按鈕,然後Android Studio就開始幹活了,然後我們可以觀察物件的建立的個數和佔用大小來發現是否發生洩漏。但是這種方法很不方面,所以我們可以藉助LeakCanary外掛;

LeakCanary會檢測應用的記憶體回收情況,如果發現有垃圾物件沒有被回收,就會去分析當前的記憶體快照,找到物件的引用鏈,並顯示在頁面上。這款外掛的好處就是,可以在手機端直接檢視記憶體洩露的地方,可以輔助我們檢測記憶體洩露;
LeakCanary使用:


在build.gradle檔案中新增

 debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'

在應用的Application onCreate方法中新增LeakCanary.install(this),如下:

@Override
    public void onCreate() {
        super.onCreate(); 
        LeakCanary.install(this);
     }

這樣我們就完成了,當發生記憶體洩露時,會有提示:

很方便!