多线程内存溢出问题记录

100 阅读1分钟

任务需求是一次性将大量图片拼接成一张大图,这里思路是使用多线程一次拼接5张图片

@Override
public void run() {
    int index = i * 5;
    MatVector images = new MatVector(5);
    Mat image = new Mat();
    System.out.println(Thread.currentThread().getName() + "-start:......");
    //加载每张图片
    for (int j = 0; j < 5; j++) {
        if (!"".equals(pics[j + index])) {
            image = imread(pics[j + index]);
        }
        images.put(j, image);
        image.release();
    }
    Stitcher stitcher = Stitcher.createDefault();
    stitcher.setWaveCorrection(false);//关闭波纹校正
    //结果存储对象
    image = new Mat();
    //进行拼接
    stitcher.stitch(images, image);
    imwrite("D:\cvtest2\" + i + ".jpg", image);
    //释放Mat对象
    images.deallocate();
    image.release();
}

读取图片之后的Mat对象、成果Mat对象和装小图片的集合对象都进行了释放,但是程序在拼接好三四十张图片之后就会报内存溢出错误

微信图片_20230411095430.jpg

根据执行现象猜测是程序中某一块内存得不到释放,随拼接1次数累计,先行记录。

已解决

解决方案:将代码中能释放的对象全部进行释放