android 內存優化(五) 使用androidstudio的Profile分析內存泄漏

    以下舉兩個熟悉的內存泄漏的例子,然後通過androidstudio的Profile來分析定位內存泄漏的地方,且通過類似的方法可以自己去驗證哪些情況會存在內存泄漏的情況,很多網上的說這種情況會泄漏那種情況會泄漏,很多都是理論,實際自己如果有時間的話可以自己去驗證,通過自己驗證的結論纔是最真實的結論!

    1.示例代碼如下,oncreate的時候new Thread,然後handler死循環延遲執行,都是內部類會持有activity的引用的例子

public class MainActivity extends Activity {
    private Handler mHandler;
    boolean mStartThreadFlag = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mHandler=new Handler();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (mStartThreadFlag){
                    int i=0;
                    i++;
                }
            }
        }).start();
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mHandler.postDelayed(this,100);
            }
        }, 100);
    }

2.之後如下圖所示,點擊運行androidstudio的Profile,之後會運行apk,並且讓Profile跑起來,之後點擊MEMORY,進入內存分析界面,其中垃圾箱圖標表示手動GC,heap dump的作用是點擊了此圖標後會在點擊的那個時間點開始持續3s左右,將此階段的apk使用的內存數據記錄下來,然後生成hprof文件,並對數據做統計和分析

 

3.之後就是模擬會出現內存泄漏的場景,頻繁的打開/關閉測試的apk,因爲Thread和handler在界面finish的時候內部邏輯還沒處理完,就會一直持有activity的引用,導致內存泄漏。

4.當做了頻繁的開關操作之後,此時先多點幾次垃圾箱GC幾次,此時會回收掉可以回收的內容,如果回收不了的就是機器本身運行的內存以及可能存在內存泄漏的部分,然後點擊heap dump之後會如下圖所示,之後爲了方便查看,將Heap Dump-app heap 的類型改爲Arrange by package

 

5.之後在package裏面依次打開com/yxz/hometest11就能找到自己寫的MainActivity的內存使用情況,理論上自己的apk界面銷燬了,理論上應該不存在自己的acitivity的引用了,但是這裏還有,就說明一直沒有被釋放,即存在內存泄漏,右上角的內容是佔內存的對象,右下角就是分析佔用內存多的對象,如圖所示即Thread和handler對象

 

6.在知道了內存泄漏的原因是因爲Thread和handler後,在代碼裏面加如下處理,即ondestroy的時候停止線程,並且將消息和runable-callback全部移除,之後再運行,頻繁的打開關閉,然後多點幾次GC,此時看到的現象就是內存會被回收很多,然後點擊heap dump,可以看到下面圖示的現象,發現會找不到自己的apk的佔用內存情況了,即不存在之前的內存泄漏的現象了,因爲線程已經停止,handerl也remove了,finish的時候不存在內部類持有acitivity的引用了,該釋放的資源也都釋放完了

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mStartThreadFlag = false;
        if(mHandler!=null){
            mHandler.removeCallbacksAndMessages(null);
        }
    }

7.補充:此時也可以將左邊生成的hprof文件導出來通過MAT工具分析

 

https://blog.csdn.net/u010672559/article/details/103178632 android 內存優化(一) 防止內存泄漏注意事項

https://blog.csdn.net/u010672559/article/details/103178663 android 內存優化(二) 性能優化

https://blog.csdn.net/u010672559/article/details/81098534 android 內存優化(三) 內存優化工具-MAT的使用及實例分析

https://blog.csdn.net/u010672559/article/details/81223122 android 內存優化(四) 性能優化-Systrace分析UI性能-含demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章