安卓内存泄露之DMA-BUF异常增长:Android Studio镜像引起DMA内存泄露

安卓内存泄露之DMA-BUF异常增长:Android Studio镜像引起DMA内存泄露 - Wesley's Blog

今天用着安卓 14 的板子的时候突然系统卡死。

查看日志发现launcher都被干掉了

03-04 06:13:35.544 7872 8479 I ActivityManager: vis BFGS 18740: com.android.launcher3 (pid 8407) service

03-04 06:13:35.544 7872 8479 I ActivityManager: com.android.launcher3/com.android.quickstep.TouchInteractionService<=Proc{8077:com.android.systemui/u0a70}

03-04 06:13:36.155 277 277 I lowmemorykiller: Kill 'com.android.launcher3' (8407), uid 10071, oom_score_adj 100 to free 39504kB rss, 46224kB swap; reason: device is low on swap (91200kB < 199552kB) and thrashing (200%)

dumpsys meminfo发现DMA-BUF占了3G多(4G设备),应用free ram基本没了。

刚开始以为是scrcpy的问题。后来经调查发现是android studio的屏幕镜像问题。

分析

开机一段时间后

Total RAM: 3,991,080K (status normal)

Free RAM: 1,166,810K ( 124,454K cached pss + 623,088K cached kernel + 419,268K free)

DMA-BUF: 1,477,628K ( 876K mapped + 1,476,752K unmapped)

DMA-BUF Heaps: 1,477,628K

DMA-BUF Heaps pool: 249,088K

​ GPU: 202,320K

Used RAM: 2,763,593K (1,036,373K used pss + 1,727,220K kernel)

Lost RAM: 195,490K

​ ZRAM: 72,700K physical used for 215,296K in swap (1,995,536K total swap)

Tuning: 192 (large 512), oom 322,560K, restore limit 107,520K (high-end-gfx)

cat /sys/kernel/dmabuf/buffers/*/size,发现有好多483328字节的 inode

cat /sys/kernel/dmabuf/buffers/*/size | grep 483328 | wc -l

有2957个,计算:2957*483328=1429200896=1.4G,和上面的结果差不多。

随便查看一个inode

roc_rk3588s_pc:/ # lsof | grep -w 7248

c2@1.1-service 543 mediacodec 2553u 0000 0,8 0t0 7248 /dmabuf:system

main 4146 root 5088u 0000 0,8 0t0 7248 /dmabuf:system

main 4146 root 5089u 0000 0,8 0t0 7248 /dmabuf:system

lsof | grep "4146" | grep dmabuf | wc -l

有2958条这样的条目

main 4146 root 5973u 0000 0,8 0t0 7690 /dmabuf:system

和上面的数目一一对应

查看是哪一个程序

roc_rk3588s_pc:/ # cat /proc/543/cmdline

/vendor/bin/hw/android.hardware.media.c2@1.1-service

roc_rk3588s_pc:/ # cat /proc/4146/cmdline

app_process/data/local/tmp/.studiocom.android.tools.screensharing.Main--socket=screen-sharing-agent-8055--flags=16

发现是android studio镜像导致的:应该是因为一直黑屏导致反复申请内存导致DMA-BUF泄露。

关闭Android Studio的Device Mirroring功能后,后面使用设备就正常了。

dmabuf_dump

通过dmabuf_dump命令可以更快地查看异常程序

roc_rk3588s_pc:/ # dmabuf_dump -h

Usage: dmabuf_dump -abh per-process/per-buffer stats

-a show all dma buffers (ion) in big table, buffer x process grid

-b show DMA-BUF per-buffer, per-exporter and per-device statistics

-h show this help

​ If PID is supplied, the dmabuf information for that process is shown.

​ Per-buffer DMA-BUF stats do not take an argument.

通过dmabuf_dump就可以查看各个程序DMA-BUF的占用情况(包含程序名字、pid、inode等等)或者加其他参数输出不同结果。

roc_rk3588s_pc:/ # dmabuf_dump 4146

​ main:4146

​ Name Rss Pss nr_procs Inode

​ system 472 kB 472 kB 1 4735

​ system 472 kB 472 kB 1 4736

​ system 472 kB 472 kB 1 4737

​ ------------------(省略几千行)----------------

​ system 472 kB 472 kB 1 7688

​ system 472 kB 472 kB 1 7689

​ system 472 kB 472 kB 1 7690

​ PROCESS TOTAL 1395232 kB 1395232 kB


dmabuf total: 1477628 kB kernel_rss: 82396 kB userspace_rss: 1395232 kB userspace_pss: 1395232 kB

参考

Implement DMABUF and GPU memory accounting in Android 12 | Android Open Source Project

相关推荐
通玄1 小时前
Jetpack Compose 入门系列(十):Paging 3 分页加载
android
hunterandroid1 小时前
DataStore 工程化实践:迁移、并发更新与异常恢复
android·前端
柒星栈3 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
程序员-珍3 小时前
报错下载android sdk失败
android·java
齊家治國平天下5 小时前
AAOS 电源管理深度解析:休眠/唤醒/功耗优化
android·车载系统·aaos·aosp·电源管理·休眠唤醒·carpowermanager
Xzaveir5 小时前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
2501_916007475 小时前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
黄林晴6 小时前
Nearby Connections 重大变更:不再自动开启 Wi-Fi / 蓝牙,适配指南
android
游戏开发爱好者86 小时前
iOS开发IDE有哪些 Xcode 和 快蝎 轻量替代方案
ide·vscode·ios·个人开发·xcode·swift·敏捷流程
恋猫de小郭6 小时前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter