gpt4 book ai didi

java-native-interface - 我是否需要 DeleteLocalRef 由 JNI 调用返回的 jstring 对象?

转载 作者:行者123 更新时间:2023-12-03 21:18:52 25 4
gpt4 key购买 nike

假设我正在使用 JNI 调用一些返回 String 的 Java 方法。 , 一世。 e. jstring在 native 代码中:

jstring jStr = (jstring)env->CallStaticObjectMethod(myApplicationClass, getString);

那我需要打电话 env->DeleteLocalRef(jStr)吗? ?我想我知道,但我在 JNI 引用中找不到任何说明如此的具体说明,而且我可以看到我有很多代码没有调用它 - 尝试过的真实代码。但是如果有轻微的内存泄漏,没有人会注意到,因为这段代码不会创建很多对象。

最佳答案

当您的 JNI 调用函数返回到 Java 时,您创建的每个本地引用都会自动释放。

JNI specification outlines two cases您可能想要使用的地方 DeleteLocalRef :

A native method accesses a large Java object, thereby creating a local reference to the Java object. The native method then performs additional computation before returning to the caller. The local reference to the large Java object will prevent the object from being garbage collected, even if the object is no longer used in the remainder of the computation.



换句话说,如果您分配了一个多兆字节的字符串并且不再需要它,您可以立即删除该引用,而不是在返回时将其留给 JVM。但是,这仅在返回之前需要在 JNI 世界中执行其他步骤时才有用。

请注意,这种情况涉及名为 的 JNI 函数。来自 Java .
通过将 native 线程附加到 JVM,您可能会遇到相反的情况,您的 native 代码调用 进入 JVM。在这种情况下,JVM 将 不是 自动释放您的本地引用,您需要自己删除本地引用。

作为这种情况的一个具体示例,在 this function in the JNI cookbook 中创建的所有本地引用会流连忘返;它们永远不会被手动清理。

A native method creates a large number of local references, although not all of them are used at the same time. Since the VM needs a certain amount of space to keep track of a local reference, creating too many local references may cause the system to run out of memory. For example, a native method loops through a large array of objects, retrieves the elements as local references, and operates on one element at each iteration. After each iteration, the programmer no longer needs the local reference to the array element.



这个更简单:本地引用的数量有一个上限。

关于java-native-interface - 我是否需要 DeleteLocalRef 由 JNI 调用返回的 jstring 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56931787/

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