和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点
一、Camera 内存包含哪些内容
二、VSS/RSS/PSS/USS 内存介绍
三、内存查看常用命令
四、内存泄漏相关知识点
五、参考文献
从Camera 角度理解Total RAM分为:Free(剩余内存)、Others(非Camera 模块)、Camera APP、cameraserver、camerahalserver、以及Linux Kernel。
另外,整个手机不只有Linux,还有其他作业系统同时运行,所以也会切走一块Reserved,比如:modem。
Camera 总内存包含:Camera app、cameraserver、camerahalserver 这三个进程的内存。
Camera 内存拆解主要包含 ION内存,Non-ion内存两个。
1.CPU 可存取,没有特别要求,通常会是这一类(比如:堆 HEAP、栈 Stack、全局变量 Global Variable等等)
2.因为各种技术成熟(虚拟地址空间 Virtual Address space ,CPU L1/L2/L3 缓存,Zram Swap... ...)此类对系统负担较轻
可以给硬体存取(GPU /ISP ...),可跨进程,跨Kernel进行内容分享(3A tunning data from userspace to kernel driver)
可以存放Camera Frame Buffers
内存占用规律 VSS >= RSS >= PSS >= USS
Virtual Set Size 虚拟耗用内存(包含共享库占用的内存,以及分配单未使用的内存)
很少被用于判断一个进程的真实内存使用量
Resident Set Size 实际使用物理内存(包含共享库占用的内存)
不能准确反映单进程内存占用情况
Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存,按照进程数等比例划分)
Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
当进程中存在可疑内存泄漏时,USS 是最佳观察数据
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 |
// 查看系统总内存
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都是正常的。
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
查看命令如下:
// 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
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*
需要先使用adb shell echo $LD_PRELOAD
查看是已经加载libudf.so ? 如果没有,需要修改代码
这个需要参考MTK 文档。
014_ISP7_相机内存优化.pdf
【腾讯文档】Camera学习知识库
https://docs.qq.com/doc/DSWZ6dUlNemtUWndv
友情推荐:
Android 开发干货集锦
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
点击阅读原文,为大佬点赞!