環(huán)境 Android Studio 4.1
利用 AS 自帶工具分析內(nèi)存分配情況
一 打開分析工具 Profiler
- 可以在 Help 中搜索關(guān)鍵字 Profiler
- 可以直接找到 View - Tool Windows - Profiler
- 打開過一次后,在底部直接打開

打開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)行分析而已。