和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点
一、Camera 内存包含哪些内容
二、VSS/RSS/PSS/USS 内存介绍
三、内存查看常用命令
四、内存泄漏相关知识点
五、参考文献
一、Camera 内存包含哪些内容
1.1 Camera 内存介绍
从Camera 角度理解Total RAM分为:Free(剩余内存)、Others(非Camera 模块)、Camera APP、cameraserver、camerahalserver、以及Linux Kernel。
另外,整个手机不只有Linux,还有其他作业系统同时运行,所以也会切走一块Reserved,比如:modem。
1.2 Camera 总内存包含哪些
Camera 总内存包含:Camera app、cameraserver、camerahalserver 这三个进程的内存。
1.3 Camera 内存拆解
Camera 内存拆解主要包含 ION内存,Non-ion内存两个。
1.3.1 Non-ion
1.CPU 可存取,没有特别要求,通常会是这一类(比如:堆 HEAP、栈 Stack、全局变量 Global Variable等等)
2.因为各种技术成熟(虚拟地址空间 Virtual Address space ,CPU L1/L2/L3 缓存,Zram Swap... ...)此类对系统负担较轻
1.3.2 ION
可以给硬体存取(GPU /ISP ...),可跨进程,跨Kernel进行内容分享(3A tunning data from userspace to kernel driver)
可以存放Camera Frame Buffers
二、 VSS/RSS/PSS/USS 内存介绍
内存占用规律 VSS >= RSS >= PSS >= USS
2.1 VSS
Virtual Set Size 虚拟耗用内存(包含共享库占用的内存,以及分配单未使用的内存)
很少被用于判断一个进程的真实内存使用量
2.2 RSS
Resident Set Size 实际使用物理内存(包含共享库占用的内存)
不能准确反映单进程内存占用情况
2.3 PSS
Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存,按照进程数等比例划分)
2.4 USS
Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
当进程中存在可疑内存泄漏时,USS 是最佳观察数据
三、 内存查看常用命令
3.1 Camera 内存查看常用基础命令
adb 命令 | 备注 |
---|---|
adb shell cat /proc/meminfo | 系统角度的内存使用情况 |
adb shell dumpsys meminfo | 系统角度dump 所有进程的内存情况 |
adb shell dumpsys meminfo 【pid】 | 指定进程的meminfo |
adb shell cat sys/kernel/debug/ion/ion_mm_heap | 需要root ,Kernel 5.1 之前 |
adb shell cat /proc/dma_heap/all_heaps | 需要root ,Kernel 5.1 之后 |
adb shell cat /proc/"查询进程的【pid】"/smaps | 需要root ,non-ion |
adb shell showmap "查询进程的【pid】" | 需要root ,non-ion |
adb shell pmap "查询进程的【pid】" | 需要root ,non-ion |
3.2 Camera 内存基础命令说明
// 查看系统总内存
adb shell cat /proc/meminfo
// dumpsys camera 相关的meminfo
adb shell dumpsys meminfo com.android.camera
adb shell dumpsys meminfo cameraserver
adb shell dumpsys meminfo camerahalserver
// 查看系统ION 内存(root版本+kernel 5.1 之前) MTK ion_view_v2.2.py 可以解析
adb shell cat sys/kernel/debug/ion/ion_mm_heap
// 查看系统ION 内存(root版本+kernel 5.1之后)MTK dma_buf_view_v1.0.py 可以解析
adb shell cat /proc/dma_heap/all_heaps
//查看 Camera 相关non-ion 内存占用 mtk parse_smap.awk 脚本可以解析
adb shell cat /proc/"pidof camera app/cameraserver/camerahalserver"/smaps
// 通常我们调试时候需要实时监测内存,这个时候使用while do循环比较好,跟grep 配合会更好
adb shell "while true;do “添加响应的adb指令” ;done"
// dumpsys hal 内存
adb shell "while true;do dumpsys meminfo camerahalserver;done"
// dumpsys hal 总内存
adb shell "while true;do dumpsys meminfo camerahalserver|grep 'TOTAL PSS';done"
// dumpsys hal Native HEAP(non-ion)
adb shell "while true;do dumpsys meminfo camerahalserver|grep 'Native Heap:';done"
// dumpsys hal ion内存 grep Graphics:或者 EGL mtrack
adb shell "while true;do dumpsys meminfo camerahalserver|grep 'Graphics:';done"
四、内存泄漏相关知识点
内存泄漏特点:
持续增长/存在明显波动增长,并且在退出Camera 后不释放。
补充说明:
持续增长/存在明显波动增长,退出Camera后释放,并非泄漏,但可能不合理。
持续增长/存在明显波动增长至少需要 > 50MB 才有机会去分析,因为Camera波动几MB,甚至几十MB都是正常的。
4.1 如何确定内存泄漏进程以及泄漏类型
1.通过 dumpsys meminfo 找到是哪个进程有泄漏(如:camera app,camerahalserver)
2.通过dumpsys meminfo [pid] 找到是 ion 内存泄漏还是non-ion 泄漏
如果是ion 泄漏,需要dump ion_mm_heap, 查看与 orphaned 孤儿进程相关的段落,比如 total orphaned ,orphaned buffer list:
根据经验一般这个 total orphaned 达到GB等级,极有可能内存泄漏。
如果是non-ion,需要dump smaps,查收是malloc 泄漏还是mmap泄漏。针对性的开malloc debug+coredump,或者mmap debug+coredump
4.2 内存泄漏Debug 手法
4.2.1 检测coredump 是否开启(eng,userdebug 版本默认开启)
查看命令如下:
// enable 开启,disable 关闭
C:\Users\Administrator>adb shell "getprop|grep 'vendor.aeev.core'"
[persist.vendor.aeev.core.direct]: [enable]
[persist.vendor.aeev.core.dump]: [enable]
// 如需关闭,请设置disable
C:\Users\Administrator>adb shell setprop persist.vendor.aeev.core.direct disable
C:\Users\Administrator>adb shell setprop persist.vendor.aeev.core.dump disable
C:\Users\Administrator>adb shell "getprop|grep 'vendor.aeev.core'"
[persist.vendor.aeev.core.direct]: [disable]
[persist.vendor.aeev.core.dump]: [disable]
C:\Users\Administrator>
或者在init.aee.customer.rc 以及在init.aee.system.rc 中设置属性enable
4.2.2 malloc 内存debug 方法
eng或者userdebug 版本参考命令
// 打开backtrace 触发NE的层数 8层
C:\Users\Administrator>adb shell "echo libc.debug.malloc.options="backtrace=8 guard=8 leak_track">>/data/local.prop"
C:\Users\Administrator>adb shell "echo libc.debug.malloc.program=camerahalserver>>/data/local.prop"
C:\Users\Administrator>adb reboot
// 重启后确认malloc debug 开关是否生效
C:\Users\Administrator>adb shell "getprop | grep malloc"
[libc.debug.malloc.options]: [backtrace=8 guard=8 leak_track]
[libc.debug.malloc.program]: [camerahalserver]
backtrace =8 表示 触发NE后backtrace 有8层,不能太多,否则预览容易黑屏或者卡顿,8层自测camera预览已经比较卡了。
或者通过setprop 进行设置,重启后失效
C:\Users\Administrator>adb shell "setprop libc.debug.malloc.options 'backtrace=8 guard=8 leak_track'"
C:\Users\Administrator>adb shell "setprop libc.debug.malloc.program camerahalserver"
C:\Users\Administrator>adb shell "getprop | grep malloc"
[libc.debug.malloc.options]: [backtrace=8 guard=8 leak_track]
[libc.debug.malloc.program]: [camerahalserver]
C:\Users\Administrator>adb shell pkill camera*
4.2.3 mmap debug 内存方法
需要先使用adb shell echo $LD_PRELOAD
查看是已经加载libudf.so ? 如果没有,需要修改代码
这个需要参考MTK 文档。
五、参考文献
014_ISP7_相机内存优化.pdf
【腾讯文档】Camera学习知识库
https://docs.qq.com/doc/DSWZ6dUlNemtUWndv
友情推荐:
Android 开发干货集锦
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
点击阅读原文,为大佬点赞!