You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中OpenCV添加release()仍存在内存泄漏问题求助

Android OpenCV 内存泄漏导致应用崩溃问题解决

你的代码存在几个关键问题,直接导致了内存泄漏和应用崩溃:

  • 高频创建Mat却未回收旧实例:onCameraFrame会被高频率调用(每秒几十次),你每次都执行bwIMG = new Mat();,旧的bwIMG实例失去引用后,其底层Native内存无法被Java GC及时回收,积累后引发内存溢出。而且你刚创建Mat就调用bwIMG.release();,属于无效操作,还会让Mat处于不可用状态。
  • 错误释放框架管理的Mat:inputFrame.rgba()返回的Mat由CameraBridgeView内部负责生命周期管理,手动调用image.release()会破坏框架的内存逻辑,反而引发异常或内存问题。
  • 冗余的System.gc()调用:手动触发GC无法解决Native内存泄漏,还会拖慢应用性能,完全没必要。

修正后的代码

public class MainActivity extends CameraActivity {

    CameraBridgeViewBase cameraBridgeViewBase;
    Mat bwIMG; // 复用的Mat成员变量

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_activity_layout); // 补充布局加载
        cameraBridgeViewBase = findViewById(R.id.cameraViewer);
        
        cameraBridgeViewBase.setCvCameraViewListener(new CameraBridgeViewBase.CvCameraViewListener2() {
            @Override
            public void onCameraViewStarted(int width, int height) {
                // 相机启动时初始化Mat,分配一次内存复用
                bwIMG = new Mat(height, width, CvType.CV_8UC3);
            }

            @Override
            public void onCameraViewStopped() {
                // 相机关闭时释放Mat,回收Native内存
                if (bwIMG != null && !bwIMG.isReleased()) {
                    bwIMG.release();
                    bwIMG = null;
                }
            }

            @Override
            public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
                Mat image = inputFrame.rgba();
                // 直接复用已初始化的bwIMG,无需重复创建
                Imgproc.cvtColor(image, bwIMG, Imgproc.COLOR_RGB2HSV);
                // 不要释放image,交由CameraBridgeView管理
                return bwIMG;
            }
        });
        
        cameraBridgeViewBase.enableView(); // 启用相机视图,原代码遗漏
    }
}

关键优化点

  1. 复用Mat对象:在相机启动时初始化一次Mat,后续帧回调直接复用,避免高频内存分配。
  2. 正确释放时机:在相机停止时释放Mat,确保Native内存被彻底回收。
  3. 遵循框架内存规则:不手动释放框架提供的Mat,避免破坏内部管理逻辑。

内容的提问来源于stack exchange,提问作者yolopoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:22:44