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

相关推荐
fundroid2 小时前
Android Studio + Gemini:重塑安卓 AI 开发新范式
android·android studio·ai编程
vortex53 小时前
谷歌黑客语法挖掘 SQL 注入漏洞
android·数据库·sql
-指短琴长-6 小时前
MySQL快速入门——基本查询(下)
android·mysql·adb
stevenzqzq7 小时前
android lambda回调
android
谢娘蓝桥8 小时前
Mac 安装 Xcode 及qt 环境安装
ide·macos·xcode
方知我8 小时前
使用VSCode进行SSH远程连接时无法与xxx建立连接
ide·vscode·ssh
重生之我要当编程大佬8 小时前
关于打不开pycharm的解决方法(一)
ide·python·pycharm
林北北的霸霸10 小时前
django初识与安装
android·mysql·adb
WarPigs11 小时前
Visual Studio笔记
ide·笔记·visual studio
Java 码农11 小时前
MySQL EXPLAIN 详解与优化指南
android·mysql·adb