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(); // 启用相机视图,原代码遗漏 } }
关键优化点
- 复用Mat对象:在相机启动时初始化一次Mat,后续帧回调直接复用,避免高频内存分配。
- 正确释放时机:在相机停止时释放Mat,确保Native内存被彻底回收。
- 遵循框架内存规则:不手动释放框架提供的Mat,避免破坏内部管理逻辑。
内容的提问来源于stack exchange,提问作者yolopoi
相关产品推荐
相关产品推荐

