安卓内存泄露之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

相关推荐
YF02111 小时前
AndroidStudio工具链配置
android studio
Kapaseker3 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴3 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭13 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab14 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe19 小时前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋1 天前
Android 协程时代,Handler 应该退休了吗?
android