1. 程式人生 > >Android Studio檢查記憶體洩漏

Android Studio檢查記憶體洩漏

1、前言

在Android Studio沒有出來之前,們普遍使用eclipse來進行開發,在開發的旅程中也會遇到發生記憶體洩漏的情況,我們可以利用MAT來進行記憶體檢測,查出具體導致記憶體洩漏的原因。而如今,這個時代已經成為歷史,在火遍全世界的今天,Android Studio成為了Android開發的驅使者,我們必須順應時代的改變來學習並使用新的開發工具。從使用Android Studio以來,相信我們都已經知道了它的基本使用,當然,使用了Android Studio後,我們也逃脫不了記憶體洩漏這一厄運給我們帶來的災難,因此,利用Android Studio來分析記憶體的使用情況,以及查出具體導致記憶體發生洩漏的原因也是我們開發者必須要掌握的一個知識點了,我在此僅將自己所理解和掌握的做一個筆記,如果讀者在閱讀中發現有錯誤之處,望予批評和評論糾正,在此先謝謝大家!

2、正文

首先來看一個例子:這裡只是部分程式碼,該程式碼是在MainActivity中。

private int time=0;

private  Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what==0){
                time++;
                tvTime.setText("time的值為:"+time);// tvTime為TextView控制元件
                handler.sendEmptyMessageDelayed(0,1000);
            }
        }
    };
由以上這幾行程式碼看來,大家都知道,這種Handler的使用方法存在一個弊端,在我們執行後再log中也會提示一個錯誤"The following Handler class should be static or leaks might occur: xxxx",為什麼會出現這樣一個提示呢,我們可以去看一下Handler的內部原理Handler剖析,這個我們就不去做過多的講解,因此以來,我們跑一下這個程式,然後退出。接下來開啟我們的記憶體使用情況檢視工具,位於Android Monitor中,點選開有兩個欄目位,一個是我們使用最多的log日誌欄,另一個則是檢視記憶體,cpu,網路,和GPU的工具欄,如圖:

記憶體使用情況

①:代表記憶體使用情況

②:當前CPU使用情況

③:當前網路狀況

④:GPU情況

當我們來回退出再次進入多次時,會發現Allocated值在不斷上升,且在Activity回收後記憶體並沒有明顯的回收,其中①為當前記憶體使用情況,②為空閒的空間,如圖:


最後上升到了8.2M左右,從原來的7.5M上升,雖然說這裡看似沒有多大影響,但是在我們不斷操作或者有大量程式碼可能存在這樣的安全隱患時,你就該擔心你的APP的存活率了,我們知道,發生記憶體洩漏就會導致卡死,即ANR,系統會則會殺死該程序,這樣的結果並不是開發者需要的。

我們接著看,是什麼原因導致了記憶體在不斷增加呢?看看具體操作:

第一步:進入待檢測的Activity或者是整個app應用

第二步:獲取我們檢測片段的Dump Java Heap


第三步:開始分析



第四步:得出結果



為什麼會出現這麼多MainActivity呢?原因是我們進入了多少次就會獲取多少個。

其次,在Reference Tree中就可以明顯的看到一行藍色的資訊,這個即為發生記憶體洩漏的地方。這個和MAT工具檢測的一模一樣,我們點選展開檢視詳細資訊,得到如圖:


從圖中可以初步定為到target中的資訊為Message處發生了記憶體洩漏,因此我們就大概可以從Handler入手處理。問題就這樣排查出來了。然我們接下來解決一下這個記憶體洩漏的問題。我們在用static來修飾一下Handler,至於為什麼這樣處理,可以查閱一下Handler機制及其使用,修改以後重新檢測,發現不再有記憶體洩漏了。到這裡記憶體檢測的學習算結束了,如果能給你帶來一點收穫,不要忘記支援一下哦。