我刚刚开始在Java中使用OpenCV,并且存在内存泄漏问题。每秒30次我读取一个图像并将其保存在监视器类中。在同一频率下,我的主线程克隆图像并在下面写的类中调用移动方法,并将克隆作为属性。
这种方法基本上应该在时域中进行低通滤波,为什么我要不断存储最新的10张图像。我在一个数组中执行此操作,每次迭代都会向后移动。附带的代码简化为问题。
下一步是将返回的值作为参数发送到另一个对象中的set-method,并将其分配给Mat对象。
在这种情况下,我得到了巨大的内存泄漏,内存消耗每分钟增加大约100MB,直到它出现内存异常。主要问题是克隆,如果我发送引用而不是克隆它,那么问题就消失了。下面给出的代码中的for循环使问题更严重(如果我使用克隆)。没有for循环,内存泄漏要小得多,但仍然存在。如果我删除了move.moving()调用并将克隆直接发送到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;
}
}
答案 0 :(得分:1)
使用copyTo()而不是clone(),clone()没有释放本机内存,我遇到了同样的问题