JavaCV本机对象解除分配

JavaCV本机对象解除分配,java,javacv,Java,Javacv,下面的JavaCV代码有什么问题?我试图填充CvSeq以进行进一步的工作,但JVM几乎可靠地崩溃,在不同的位置出现异常访问冲突,最常见的是[msvcr100.dll+0x3c19b]memcpy+0x20b或[opencv\u core243.dll+0x61793]cvSeqPush+0x133 public static void main(String[] args) { CvMemStorage memStorage = CvMemStorage.create(); Cv

下面的JavaCV代码有什么问题?我试图填充CvSeq以进行进一步的工作,但JVM几乎可靠地崩溃,在不同的位置出现异常访问冲突,最常见的是
[msvcr100.dll+0x3c19b]memcpy+0x20b
[opencv\u core243.dll+0x61793]cvSeqPush+0x133

public static void main(String[] args) {
    CvMemStorage memStorage = CvMemStorage.create();
    CvSeq seq = cvCreateSeq(0, Loader.sizeof(CvSeq.class), 
          Loader.sizeof(CvPoint.class), memStorage);

    for (int j=0; j<1000000; j++) {
        CvPoint cvPoint = cvPoint(j, j+1);
        System.out.println(j);
        cvSeqPush(seq, cvPoint);
    }
}
publicstaticvoidmain(字符串[]args){
CvMemStorage memStorage=CvMemStorage.create();
CvSeq seq=cvCreateSeq(0,Loader.sizeof(CvSeq.class)),
Loader.sizeof(CvPoint.class),memStorage);

对于(int j=0;j而言,问题在于,垃圾收集器在代码中最后一次引用
memStorage
后将其识别为未使用,而不是在块的末尾。这会导致本机对象在循环中发生的第一次GC之后解除分配。这就是为什么只有在不使用调试器时才会重现问题的原因

解决方案是在循环后添加对
memStorage
的一些引用,以防止GC释放它。最好的方法是调用
memStorage.release()
主动释放本机内存,而不必等待GC,并防止在仍然需要时过早释放内存

请参阅我与JavaCV和JavaCPP作者Samuel Audet的讨论,其中还有几个本机分配问题: