gpt4 book ai didi

java - 我必须 DeleteLocalRef 一个我调用了 NewGlobalRef 的对象吗?

转载 作者:行者123 更新时间:2023-11-30 08:12:00 27 4
gpt4 key购买 nike

正如我们所知,在 C/C++ 拥有的线程中创建 Java 对象,我们负责根据需要调用 DeleteLocalRefPush/Pop LocalFrame

我有一些代码,比如

jbyteArray buffer = env->NewByteArray((jsize)requiredSize);
longTermBufferReference = (jbyteArray)env->NewGlobalRef(buffer);

本地代码创建一个字节数组,它在多个线程/调用中重复使用,一旦我们完成它,我在缓冲区上调用 DeleteGlobalRef

问题是,完成后我是否必须在 buffer 上调用 DeleteLocalRef,或者 GlobalRef 是否完全拥有该对象?

最佳答案

在垃圾收集系统中,没有对象所有权这样的东西。存在根对象引用和可从根直接或间接到达的对象引用。 (不考虑弱引用)。

JNI 本地引用和 JNI 全局引用都是根引用。创建其他引用不会影响现有引用,也不会将它们从根引用列表中删除。

所以,是的,必须删除本地引用(就像必须删除全局引用一样)。您已经知道可以使用 DeleteLocalRefPopLocalFrame 显式执行此操作,或者,当 JNI native 方法返回时,JNI 会有效地自动调用 PopLocalFrame

关于java - 我必须 DeleteLocalRef 一个我调用了 NewGlobalRef 的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30721635/

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