You need to enable JavaScript to run this app. Android Q环境下Camera2Basic应用启动后PSS持续增长问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Android Q环境下Camera2Basic应用启动后PSS持续增长问题求助

Camera2Basic Android Q版本Native堆PSS异常上涨处理方案

问题背景

  • 测试环境:Android Q
  • 复现步骤:
    1. 打开Camera2Basic应用
    2. 选择任意摄像头,示例为后置JPEG摄像头(Back JPEG (0))
    3. 保持应用处于前台运行状态
    4. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 18:15:10