[Note] 2020-11-05 Android上排查內(nèi)存問題之內(nèi)存分配分析

環(huán)境 Android Studio 4.1

利用 AS 自帶工具分析內(nèi)存分配情況

一 打開分析工具 Profiler

  1. 可以在 Help 中搜索關(guān)鍵字 Profiler
  2. 可以直接找到 View - Tool Windows - Profiler
  3. 打開過一次后,在底部直接打開
打開Profiler工具.png

二 Profiler 界面

右鍵底部的 Profiler tab,可以選擇 View Mode,設(shè)置為 Windows 模式,獨(dú)立成窗口模式,比較容易看(而且開發(fā)的一般有兩個(gè)屏幕,把 Profile 窗口放到另外一個(gè)屏幕剛好一個(gè)屏幕看代碼,一個(gè)屏幕看 Profiler 工具分析窗口)

設(shè)置窗口模式.png

窗口模式.png

三 開始錄制分析內(nèi)容

選擇目標(biāo)進(jìn)程(或者打開 Profiler 工具,直接 Run 項(xiàng)目,就自動(dòng)選擇為當(dāng)前 Run 的進(jìn)程)

選擇目標(biāo)進(jìn)程.png

Profiler監(jiān)控某個(gè)進(jìn)程的界面.png

選擇Memory.png

開始錄制某一段時(shí)間內(nèi)某個(gè)對象類型分配內(nèi)存的次數(shù).png

查看錄制結(jié)果.png

查看各個(gè)線程內(nèi)存分配情況.png

圖的方式查看.png

根據(jù)線程號查找進(jìn)程的方法.png

接下來抓大頭的分析各個(gè)線程的情況時(shí),可以看到 6699 分配了 64次,總大小 29M多,然后查看該線程的任務(wù),以排查代碼中的問題(給線程起個(gè)名字是多么重要哇~)

四 一個(gè)例子

    @Override
    protected void onCreate(Bundle savedInstanceState) { 
        // ...
        testThread.start();
    }


    private Thread testThread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                allocMethod();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }, "alloc_thread");

    private byte[] allocMethod() {
        Log.d("test", "allocMethod:");
        return new byte[(int) (1024 * 10)];
    }
結(jié)果.png

五 最后

其實(shí)對象分配內(nèi)存的次數(shù)可以有效分析一些內(nèi)存問題,比如內(nèi)存抖動(dòng)等問題
當(dāng)然,寫個(gè)例子用來分析是非常簡單的,但是實(shí)際項(xiàng)目中的問題定位起來肯定會(huì)異常地困難,這里的主要目的是解釋如何使用這個(gè)工具進(jìn)行分析而已。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容