如果未在本机方法中创建,何时清除本地引用

When will local reference be cleared if not created inside native method?

本文关键字:清除 何时 引用 创建 本机 方法 如果      更新时间:2023-10-16

我通过CreateJavaVM初始化了一个JavaVM,并通过jvm->GetEnv得到了一个JNIEnv,并通过FindClassNewObjectCallObjectMethod等创建了一些本地引用。

在JNI在线文档中,它说

在大多数情况下,程序员应该依靠 VM 在本机方法返回后释放所有本地引用。

我想知道这些本地引用会自动清除,还是应该通过DeleteLocalRefPopLocalFrame手动清除它们?

当 JNI 函数调用返回时,您的本地引用将被释放并自动进行垃圾回收。因此,我们不必在大多数时候手动释放 JNI 调用中的本地引用。

在特殊情况下,如果 JNI 调用中有大量本地引用,则应在完成使用后手动删除DeleteLocalRef引用,不再需要它们。

JNI中有一个函数调用,以确保您可以创建的本地引用的数量,EnsureLocalCapacity

引自JNI文件。

JDK/JRE 1.1 提供了上面的 DeleteLocalRef 函数,以便程序员可以手动删除本地引用。例如,如果本机代码循环访问可能较大的对象数组,并在每次迭代中使用一个元素,则最好在下一次迭代中创建新的本地引用之前删除对不再使用的数组元素的本地引用。

对于全局引用,垃圾回收器和JVM对我们没有太多工作,我们应该始终跟踪并手动释放它们,否则会导致内存泄漏。

有关使用 JNI 的最佳实践的更多信息,我建议使用这篇 developerworks 文章。