Android Q环境下Camera2Basic应用启动后PSS持续增长问题求助
Camera2Basic Android Q版本Native堆PSS异常上涨处理方案
问题背景
- 测试环境:Android Q
- 复现步骤:
- 打开Camera2Basic应用
- 选择任意摄像头,示例为后置JPEG摄像头(Back JPEG (0))
- 保持应用处于前台运行状态
- 执行
procrank | grep -i camera2周期性采集应用PSS数据,示例输出:
target:/ # procrank | grep -i camera2 5455 5381720K 219916K 111828K 104916K com.android.example.camera2.basic target:/ # procrank | grep -i camera2 5455 5414488K 230008K 121916K 115000K com.android.example.camera2.basic target:/ # procrank | grep -i camera2 5455 5815896K 411812K 303704K 296772K com.android.example.camera2.basic - 观测现象:应用PSS最高攀升至900MB,需5~6分钟才回落至200MB,对低内存目标设备适配不友好
- 初步排查结论:通过pmaps数据分析,确认PSS增长来源于Native堆的
anon:libc_malloc内存段,非Java堆泄漏
可行处理方案
1. 精准定位内存增长来源
- 开启Native内存分配调试,应用启动前执行以下命令抓取内存分配栈trace,直接关联
libc_malloc段增长的具体调用路径(常见增长源为ImageReader缓冲区、YUV转JPEG临时内存、预览帧处理缓存):setprop debug.libc.malloc.debug 1 && setprop debug.libc.malloc.fill 1 && setprop debug.libc.malloc.guard 1 - 优先核查应用层ImageReader回调逻辑:确认每一次从
OnImageAvailableListener获取的Image对象,在处理完成后都及时调用Image.close(),避免缓冲区被长期持有导致PSS持续累积。
2. 系统层内存适配优化
- 低内存设备可修改
/system/build.prop配置,从源头限制Camera框架的内存分配规模:ro.config.low_ram=true persist.debug.camera.max_preview_buffers=2 - 针对Android Q版本的Native堆回收逻辑,可在应用初始化阶段主动设置Native堆分配上限,避免无限制增长,配置项为应用Manifest中添加
android:hardwareAccelerated="true"的同时,关闭非必要的Camera2框架冗余缓存。
3. 快速规避方案
- 调整Camera2Basic默认的ImageReader配置,将最大待处理缓冲区数量从默认的3调整为1,减少多帧排队处理导致的临时内存累积。
- 周期性触发内存回收逻辑:应用每间隔1分钟执行一次
Runtime.getRuntime().gc()+System.runFinalization(),加速Native堆未引用内存的回收效率,缩短PSS回落等待时间。
内容的提问来源于stack exchange,提问作者Jai Shiv
相关产品推荐
相关产品推荐

