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

From what I understand, the Java wrapper for OpenCV's Mat has a tiny footprint. The underlying native objects may be using gigabytes of memory (it was in my case) and the GC knows nothing about it.

The only 2 options are to:

  • Manually deallocate native memory using Mat.release().
  • Call System.gc() every so often to force garbage collection of unreferenced Mat wrapper objects. Note, if you are using something like VideoCapture to read in frames, you will absolutely want to NOT call System.gc() every frame read as it will destroy performance. I call it about every 20 seconds in my application.
于 2016-08-13T20:35:16.387 に答える