我按CreateJavaVM
初始化了一个JavaVM,JNIEnv
获得了jvm->GetEnv
,并FindClass
,NewObject
或{{1}创建了一些本地引用等等。
在JNI在线文档中,它说
在大多数情况下,程序员应该依赖VM在本机方法返回后释放所有本地引用。
我想知道这些本地引用会自动清除,还是应该由CallObjectMethod
或DeleteLocalRef
手动清除?
答案 0 :(得分:-2)
当JNI函数调用返回时,将释放本地引用并自动收集垃圾。因此,我们不必在大多数时间手动释放JNI呼叫中的本地引用。
在特殊情况下,如果您的JNI呼叫中存在大量本地引用,则应在完成使用后不再需要DeleteLocalRef
手动删除引用。
JNI中有一个函数调用,以确保您可以创建的本地引用数EnsureLocalCapacity
。
引自JNI document。
JDK / JRE 1.1提供了上面的DeleteLocalRef函数,以便程序员可以手动删除本地引用。例如,如果本机代码遍历可能很大的对象数组并在每次迭代中使用一个元素,那么在创建新的本地引用之前删除对不再使用的数组元素的本地引用是一个好习惯。下一次迭代。
对于全局引用,垃圾收集器和JVM不会为我们做很多工作,我们应该始终跟踪并手动释放它们,否则会导致内存泄漏。
有关使用JNI的最佳做法的更多信息,我建议developerworks article。