Java垃圾收集:数组内存泄漏(使用OpenCV)

时间:2015-11-14 12:57:02

标签: java opencv memory-leaks

我刚刚开始在Java中使用OpenCV,并且存在内存泄漏问题。每秒30次我读取一个图像并将其保存在监视器类中。在同一频率下,我的主线程克隆图像并在下面写的类中调用移动方法,并将克隆作为属性。

这种方法基本上应该在时域中进行低通滤波,为什么我要不断存储最新的10张图像。我在一个数组中执行此操作,每次迭代都会向后移动。附带的代码简化为问题。

下一步是将返回的值作为参数发送到另一个对象中的set-method,并将其分配给Mat对象。

在这种情况下,我得到了巨大的内存泄漏,内存消耗每分钟增加大约100MB,直到它出现内存异常。主要问题是克隆,如果我发送引用而不是克隆它,那么问题就消失了。下面给出的代码中的for循环使问题更严重(如果我使用克隆)。没有for循环,内存泄漏要小得多,但仍然存在。如果我删除了move.movi​​ng()调用并将克隆直接发送到set-method,也是如此。

但我不明白为什么会有内存泄漏。当我将我的变量分配给新的克隆对象时,旧克隆应该是未引用的,因此在下一个GC中进行清理?

private void update(){
    if (videoMon.haveImage()) {
        // Takes the image from the monitor
        Mat m = videoMon.getImageMat();
        // Sends a clone to the method stated given further down
        // and then to the setImage where it is assigned to the local object
        videoPanel.setImage(movement.moving(m.clone()));
        videoPanel.repaint();
    }
}

另一种方法

public class Movement {
    private static final int NBR_OLD_IMAGES = 10;

    Mat [] lastImages;

    public Movement(){
        lastImages = new Mat[NBR_OLD_IMAGES];
    }

    public Mat moving(Mat image){
        for (int i = NBR_OLD_IMAGES-1; i > 0; i--){
            lastImages[i] = lastImages[i-1];
        }
        lastImages[0] = image;

        return image;
    }
}

1 个答案:

答案 0 :(得分:1)

使用copyTo()而不是clone(),clone()没有释放本机内存,我遇到了同样的问题