掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
文末本文轉(zhuǎn)載自微信公眾號「程序喵大人」,作者程序喵大人。轉(zhuǎn)載本文請聯(lián)系程序喵大人公眾號。

最近在調(diào)試Android Native層的內(nèi)存泄漏問題,整理了一些筆記,分享一下
在代碼中打印,開啟一個線程,間隔固定時間打印出當前內(nèi)存信息【有好多種獲取內(nèi)存信息的API,這里只列出其中一種方式,親測有效】
- private void startMemProfiler() {
- new Thread(new Runnable() {
- @Override
- publiC++ void run() {
- while (true) {
- displayMemory();
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- }
- private void displayMemory() {
- final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
- ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
- activityManager.getMemoryInfo(info);
- Log.i(TAG, "系統(tǒng)剩余內(nèi)存:" + (info.availMem / (1024 * 1024)) + "M");
- Log.i(TAG, "系統(tǒng)是否處于低內(nèi)存運行:" + info.lowMemory);
- Log.i(TAG, "當系統(tǒng)剩余內(nèi)存低于" + (info.threshold / (1024 * 1024)) + "M" + "時就看成低內(nèi)存運行");
- Log.i(TAG, "系統(tǒng)已經(jīng)分配的native內(nèi)存:" + (Debug.getNativeHeapAllocatedSize() / (1024 * 1024)) + "M");
- Log.i(TAG, "系統(tǒng)還剩余的native內(nèi)存:" + (Debug.getNativeHeapFreeSize() / (1024 * 1024)) + "M");
- Log.i(TAG, "系統(tǒng)的所有native內(nèi)存大?。? + (Debug.getNativeHeapSize() / (1024 * 1024)) + "M");
- }
- adb shell dumpsys meminfo /
- adb shell dumpsys meminfo tv.danmaku.bili
dumpsys meminfo顯示的信息如圖所示:
這里僅介紹我們需要重點關(guān)注的字段:
matrix的使用
通過集成matrix庫,可以選擇hook某個動態(tài)鏈接庫的malloc和free符號,然后工作方式和libctools類似,存儲malloc的節(jié)點,free時候就刪除該節(jié)點,最后統(tǒng)計內(nèi)存泄漏情況。
matrix的集成方式可以看github庫:https://github.com/Tencent/matrix
hook的原理可以看:https://github.com/iqiyi/xHook/blob/master/docs/overview/android_plt_hook_overview.zh-CN.md
如果出現(xiàn)內(nèi)存泄漏,會有json和log后綴的文件,如圖:
json文件會統(tǒng)計哪個庫泄漏了多少內(nèi)存,log文件會記錄具體泄漏的堆棧信息。
拿到具體泄漏的堆棧信息后,可以通過addr2line工具定位到具體的代碼:
- /Users/xxx/Android/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line -C -f -e /Users/xxx/project/java/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libBMMCapture-Android.so 83a70
效果如圖:
dumpsys還有一些其它功能,使用方式如下:
背景:每次出現(xiàn)內(nèi)存泄漏時,經(jīng)常懷疑是某個模塊或者其他庫更新導(dǎo)致,但又沒有證據(jù),沒有合適的排查內(nèi)存泄漏的方法論。
分析與解決:
○內(nèi)存泄漏:Android使用matrix,iOS使用Xcode
○cpu占用率:Android profiler, iOS Xcode
○gpu占用率:Android 高通使用snapdragonprofiler,或者perfdog(收費)
相關(guān)資料推薦
https://developer.android.com/topic/performance/memory-management?hl=zh-cn
https://developer.android.com/studio/profile/memory-profiler
https://developer.android.com/studio/command-line/dumpsys
https://github.com/iqiyi/xHook/blob/master/docs/overview/android_plt_hook_overview.zh-CN.md
參考資料
https://developer.android.com/studio/command-line/dumpsys
https://blog.csdn.net/pugongying1988/article/details/16838859
https://www.jianshu.com/p/8203457a11cc

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流