gpt4 book ai didi

JavaCV native 对象释放

转载 作者:行者123 更新时间:2023-12-01 14:41:39 29 4
gpt4 key购买 nike

以下 JavaCV 代码有什么问题?我尝试填充 CvSeq 以进行进一步的工作,但 JVM 几乎 在不同位置可靠地崩溃,并出现 EXCEPTION_ACCESS_VIOLATION,最常见的是 [msvcr100.dll+0x3c19b] memcpy+0x20b[opencv_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);
}
}

在我的配置中,它最常在大约 50000 次迭代后失败,但有时会以其他次数失败,或者根本不会失败。显然存在一些分配/释放错误。并且仅当不在 Debug模式下运行时才会重现。

如果我在 20000 次迭代后显式调用 System.gc(),它会在 GC 之后(或 1-2 次迭代之后)在 cvSeqPush 内失败,可能是因为指针来自已释放的空间恰好指向正确的地址)。或者,如果我同时设置 XmxXms 参数,它迟早会失败。可能正在使用的东西会被自动释放。

最佳答案

问题是,垃圾收集器在代码中最后一次引用 memStorage 后(而不是在 block 末尾)将其识别为未使用。这会导致 native 对象在循环中发生的第一次 GC 之后释放。这就是为什么只有在不使用调试器时才会重现问题的原因。

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

请参阅我与 JavaCV 和 JavaCPP 作者 Samuel Audet 的讨论,其中包含更多 native 分配问题:https://groups.google.com/forum/?fromgroups=#!topic/javacv/ffQSkfXnT0o

关于JavaCV native 对象释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15896044/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com