java - JNI EnsureLocalCapacity——为什么?

标签 java java-native-interface

在这里查看 JNI 文档:http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

具体的看EnsureLocalCapacity函数的描述中是怎么说的:

For backward compatibility, the VM allocates local references beyond the ensured capacity. (As a debugging support, the VM may give the user warnings that too many local references are being created. In the JDK, the programmer can supply the -verbose:jni command line option to turn on these messages.) The VM calls FatalError if no more local references can be created beyond the ensured capacity.

此外,看看 PushLocalFrame 如何接受“容量”参数。 (顺便说一下,它没有提到这是硬限制,还是像 EnsureLocalCapacity 那样的软限制)。

这些关于本地引用容量的废话到底从何而来?文档说 VM 愿意分配超出当前正式容量的引用,那么它为什么不这样做并让 API 中的所有这些容量杂乱无章?

打个比方C,感觉就像是让我预先计划我要调用多少次malloc(),感觉有点可笑。

有什么重要的东西我只是没在这里看到吗?

最佳答案

据我了解,本地引用表的大小是预定义的,如果分配的超过该大小,它就会崩溃。所以并不是说 VM 会永远给你更多的本地引用。在 Android 上使用 JNI 时,我遇到过很多次。通常很难发现这样的内存泄漏。每次使用 JNI 本地引用执行某些操作时调用 env->DeleteLocalRef() 只会使代码困惑。因此,与其使用 DeleteLocalRef() 调用使代码困惑,不如确保我们不会创建太多引用并保持代码非常干净。即使我们计划分配更多的本地引用,我们仍然可以只调用 PushLocalFrame()/PopLocalFrame() 并避免多次调用 DeleteLocalRef()。

因此,为了让您类比“C”,您需要预先计划对 malloc 的调用,以避免在最后对 free() 进行所有必要的调用。

关于java - JNI EnsureLocalCapacity——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7081853/

相关文章:

java - 小程序能否打开与其服务器的套接字连接

java - JVM 主机应用程序中的 JNI 本地引用生命周期

java - 加载JNI共享库失败 "C:\Program Files\Java\jdk1.7.0_40\bin\..\jre\bin\server\jvm.dll"

使用有效指针从 C 调用方法后出现 Java JNI NullPointerException

java - mongodb java查询日期的where子句

java - 无法再使用查询获取 Google Drive App Data 文件夹内容

java - 是每个类一个记录器还是一组被整个应用程序访问的记录器?

java - Maven 检查样式作为构建的一部分

java - xxx(JNIEnv *env, jobject thisObj) 和 xxx(JNIEnv *env, jclass cls) 有什么区别?

java - 无法在 Java/C++ 中为外部应用程序设置永远在线