1

我在java中有这段代码,ram中的内存几乎在几秒钟内就爆炸了。我发布了 IplImage “imagensMedia”。为什么??

编辑:此功能每秒运行多次

int largura=1280;
int altura=800;

IplImage[] imagens = new IplImage[5];
IplImage imagensSoma=cvCreateImage(cvSize(largura,altura), 32, 3);
int indiceImagem=0;

for(x=0; x<imagens.length;x++)
   imagens[x]=cvCreateImage(cvSize(largura,altura), 8, 3);

public void imageArrayBuilder() //Constroi Array de Imagens e a Sua Media
{
    int z;
    IplImage imagensMedia =cvCreateImage(cvSize(largura,altura), 8, 3);

    cam.read();
    opencv.copy(cam.get());

    if(imagemTotalFlag)
    {
        cvSub(imagensSoma,imagens[indiceImagem],imagensSoma, null);
        cvAcc(opencv.Buffer, imagensSoma, null);
        cvConvertScale(imagensSoma, imagensMedia, 1.0/imagens.length,0);
        cvCopy(opencv.Buffer,imagens[indiceImagem],null);
        indiceImagem++;
        if(indiceImagem==imagens.length)
            indiceImagem=0;
        opencv.copy(imagensMedia);    
    }
    else
    {
        if(indiceImagem<imagens.length)
        {
            cvCopy(opencv.Buffer,imagens[indiceImagem],null);
            indiceImagem++;
            if(indiceImagem==imagens.length)
            {
                imagemTotalFlag=true;
                for(z = 0; z < imagens.length; z++)
                    cvAcc(imagens[z], imagensSoma, null);
                cvConvertScale(imagensSoma, imagensMedia, 1.0/imagens.length,0);
                indiceImagem=0;
                opencv.copy(imagensMedia);
            }
        }
    }
    cvReleaseImage(imagensMedia);   
}

请有人帮我...

4

2 回答 2

5

我不认为“内存泄漏”的概念真的适用于 java,因为它是一种垃圾收集语言(当没有其他对象引用它们时,引用会自动删除)。评论给出了一些关于内存使用位置的可能性;我建议研究垃圾收集的工作原理(请参阅此链接了解初学者)。如果一切都失败了,调用System.gc()将运行垃圾收集器,或者更具体地说:

调用 gc 方法表明 Java 虚拟机花费精力回收未使用的对象,以便使它们当前占用的内存可用于快速重用。当控制从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间。

除此之外,检查无限循环或无限递归。

希望这可以帮助。

于 2013-01-02T21:36:53.963 回答
1

据我了解,OpenCV 的 Java 包装器Mat占用空间很小。底层的本机对象可能正在使用千兆字节的内存(在我的情况下),而 GC 对此一无所知。

仅有的两个选项是:

  • 使用Mat.release().
  • 经常调用System.gc()以强制对未引用的Mat包装器对象进行垃圾收集。请注意,如果您使用类似VideoCapture读取帧的方法,您绝对不希望调用System.gc()每帧读取,因为它会破坏性能。我在我的应用程序中大约每 20 秒调用一次。
于 2016-08-13T20:35:16.387 回答