在这种情况下,垃圾回收器会销毁我的对象吗?

3

我在我的Java代码中有一个方法,返回类A的对象。这个对象通过JNI调用传递给本地函数,在Java代码中不再使用,但是它将长期在C++端使用。

我应该担心垃圾收集器销毁我的对象吗?因为它在Java端不再出现?


2
你能展示一些相关的代码吗? - Jonathan M
如果你不担心代码中的对象,那么你为什么要关心垃圾回收器的工作呢?反正你也不会使用这个类。 - Buhake Sindi
@BuhakeSindi - 但是JNI代码仍在使用它。 - OldCurmudgeon
虽然我不是专家,但这篇文章表明对象的全局引用将使其保留在堆中。 - OldCurmudgeon
@Jonathan:我还没有写代码,所以我很疑惑。基本上,A对象是一个图像,而本地函数对图像进行了一些重度处理(但在完成整个处理之前就返回了,因此需要将对象保留在内存中)。 - hahaha1256
1个回答

6
这在JNI规范中有详细解释:
JNI将本地代码使用的对象引用分为两类:局部引用和全局引用。局部引用有效期限于本机方法调用期间,并在本机方法返回后自动释放。全局引用一直保持有效,直到它们被明确释放。
所以,你的问题的答案取决于你的C++代码中是否有本地引用或全局引用。
对象作为局部引用传递给本机方法。JNI函数返回的所有Java对象都是局部引用。JNI允许程序员从本地引用创建全局引用。
这基本上意味着,除非您显式地将任何引用转换为全局引用(使用NewGlobalRef),否则它们只能在JNI调用持续时间内“引用”。因此,如果代码返回并且没有Java代码引用该对象,则可以进行垃圾回收。

谢谢。不太确定我是否完全理解了,但是由于我希望在JNI调用返回后仍然保留我的对象在内存中,并且由于在JNI调用之后该对象在Java代码中不再使用,所以我需要使用全局引用吗? - hahaha1256
@hahaha1256:确切地说,如果您不创建全局引用,那么一旦 JNI 调用返回并且对象可能被 GC 回收,该引用将变得无效。 - Joachim Sauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接