如果未在本机方法中创建,何时清除本地引用
When will local reference be cleared if not created inside native method?
我通过CreateJavaVM
初始化了一个JavaVM,并通过jvm->GetEnv
得到了一个JNIEnv
,并通过FindClass
,NewObject
或CallObjectMethod
等创建了一些本地引用。
在JNI在线文档中,它说
在大多数情况下,程序员应该依靠 VM 在本机方法返回后释放所有本地引用。
我想知道这些本地引用会自动清除,还是应该通过DeleteLocalRef
或PopLocalFrame
手动清除它们?
当 JNI 函数调用返回时,您的本地引用将被释放并自动进行垃圾回收。因此,我们不必在大多数时候手动释放 JNI 调用中的本地引用。
在特殊情况下,如果 JNI 调用中有大量本地引用,则应在完成使用后手动删除DeleteLocalRef
引用,不再需要它们。
JNI中有一个函数调用,以确保您可以创建的本地引用的数量,EnsureLocalCapacity
。
引自JNI文件。
JDK/JRE 1.1 提供了上面的 DeleteLocalRef 函数,以便程序员可以手动删除本地引用。例如,如果本机代码循环访问可能较大的对象数组,并在每次迭代中使用一个元素,则最好在下一次迭代中创建新的本地引用之前删除对不再使用的数组元素的本地引用。
对于全局引用,垃圾回收器和JVM对我们没有太多工作,我们应该始终跟踪并手动释放它们,否则会导致内存泄漏。
有关使用 JNI 的最佳实践的更多信息,我建议使用这篇 developerworks 文章。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 何时提供默认参数作为模板参数
- C++-明确何时以及如何调用析构函数
- 清除前检查矢量
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- ifstream文件在从行中读取时被清除
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 如果非动态变量被指针引用,何时超出范围?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 何时定义QT_NO_CONTEXTMENU?
- 如何清除/清空已打开的文件C++
- 何时为派生类初始化 vptr?
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 指针的 C++ 动态数组 - 何时需要使用它?
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 变量的值何时可以在C++中意外更改?
- 如果未在本机方法中创建,何时清除本地引用
- 了解Qt视图模型架构:何时创建以及如何在QAbstractItemModel实现中清除索引
- 何时何地清除c++中的输入流