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

相关推荐
云起SAAS13 小时前
私域直播系统UniApp源码 多商户商城+直播带货 微信小程序+H5+安卓iOS
android·微信小程序·uni-app·私域直播系统
空中海13 小时前
01. 安卓逆向基础、环境搭建与授权
android
星河耀银海13 小时前
JAVA 泛型与通配符:从原理到实战应用
android·java·服务器
Ada大侦探13 小时前
新手小白学习数据分析01----数据分析师???& 数据分析思维学习
android·学习·数据分析
空中海14 小时前
安卓逆向5. 安卓风险防护、加固复测与综合
android
Mr -老鬼14 小时前
EasyClick 双端自动化智能体|Android&iOS 全平台 EC 脚本开发助手
android·ios·自动化·易点云测·#easyclick·#ios自动化
千码君201614 小时前
flutter:与Android Studio模拟器的调试分享
android·flutter
MeAT ITEM15 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
molihuan15 小时前
最新 将 MuPDF 编译到 Android 动态库 PDF解析渲染引擎
android·pdf
Rick199315 小时前
mysql 慢查询怎么快速定位
android·数据库·mysql