MemoryLeakDetector內(nèi)存泄漏監(jiān)控工具
MemoryLeakDetector 是字節(jié)跳動(dòng)西瓜視頻基礎(chǔ)技術(shù)團(tuán)隊(duì)開發(fā)的一款 native 內(nèi)存泄漏監(jiān)控工具,具有接入簡(jiǎn)單、監(jiān)控范圍廣、性能優(yōu)良、 穩(wěn)定性好的特點(diǎn)。廣泛用于字節(jié)跳動(dòng)旗下各大 App 的 native 內(nèi)存泄漏治理,收益顯著。
快速開始
步驟1:將 JitPack 存儲(chǔ)庫(kù)添加到構(gòu)建文件
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
步驟2:添加依賴項(xiàng)
dependencies {
implementation 'com.github.bytedance:memory-leak-detector:0.1.8'
}
步驟3:添加用于簡(jiǎn)單使用的代碼(使用廣播控件不需要此步驟)
// 監(jiān)控指定的so
Raphael.start(
Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024,
"/storage/emulated/0/raphael", // need sdcard permission
".*libxxx\\\\\\\\.so$"
);
// 監(jiān)控整個(gè)進(jìn)程
Raphael.start(
Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024,
"/storage/emulated/0/raphael", // need sdcard permission
null
);
## 通過(guò)本地廣播監(jiān)控指定的so
## 0x0CF0400=Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024
adb shell am broadcast -a com.bytedance.raphael.ACTION_START -f 0x01000000 --es configs 0xCF0400 --es regex ".*libXXX\\\\\\\\.so$"
## 監(jiān)控整個(gè)進(jìn)程(RaphaelReceiver 組件所在的進(jìn)程)
## 0x0CF0400=Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024
adb shell am broadcast -a com.bytedance.raphael.ACTION_START -f 0x01000000 --es configs 0xCF0400
步驟4: 打印結(jié)果
// 代碼控制
Raphael.print();
## 本地廣播
adb shell am broadcast -a com.bytedance.raphael.ACTION_PRINT -f 0x01000000
步驟5:分析
## 聚合 report,該文件在 print/stop 之后生成,需要手動(dòng) pull 出來(lái)
## 用到離線符號(hào)符號(hào)化功能的,需將raphael.py里的addr2line改為自己本地的NDK路徑
## -r: 日志路徑, 必需,手機(jī)端生成的report文件
## -o: 輸出文件名,非必需,默認(rèn)為 leak-doubts.txt
## -s: 符號(hào)表目錄,非必需,有符號(hào)化需求時(shí)可傳,符號(hào)表文件需跟so同名,如:libXXX.so,多個(gè)文件需放在同一目錄下兒
python3 library/src/main/python/raphael.py -r report -o leak-doubts.txt -s ./symbol/
## 數(shù)據(jù)格式說(shuō)明
## 201,852,591 totals // 單指raphael攔截到的未釋放的虛擬內(nèi)存總和
## 118,212,424 libandroid_runtime.so
## 28,822,002 libhwui.so
## 24,145,920 libstagefright.so
## 15,679,488 libv8.cr.so
## 9,566,192 libc++_shared.so
## 25,536 libsqlite.so
## 12,288 libv8_libbase.cr.so
## 5,388,741 extras // raphael.py里預(yù)設(shè)了一些通用配置,可以通過(guò)修改規(guī)則進(jìn)一步識(shí)別分組到extras里的數(shù)據(jù)
##
##
## bdb11000, 70828032, 66 => bdb11000是report里此堆棧第一次分配出的內(nèi)存地址,70828032是report里此堆棧的內(nèi)存總和,66是report里此堆棧的總次數(shù)
## 0x000656cf /system/lib/libc.so (pthread_create + 246)
## 0x0037c129 /system/lib/libart.so (art::Thread::CreateNativeThread(_JNIEnv*, _jobject*, unsigned int, bool) + 448)
## 0x00112137 /system/framework/arm/boot.oat (java.lang.Thread.nativeCreate + 142)
## 分析 maps
## -m: maps文件路徑,必需
python3 library/src/main/python/mmap.py -m maps
步驟6:停止監(jiān)控
// 代碼控制
Raphael.stop();
## 廣播控制
adb shell am broadcast -a com.bytedance.raphael.ACTION_STOP -f 0x01000000
評(píng)論
圖片
表情
