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

Java 在这种情况下,垃圾收集器会销毁我的对象吗?,java,garbage-collection,java-native-interface,Java,Garbage Collection,Java Native Interface,我在Java代码中有一个方法,它返回一个类a的对象,这个对象通过JNI调用传递给本机函数,在Java代码中不再使用。但它将在C++端长期使用 我是否应该关心垃圾收集器破坏我的对象,因为它不再出现在Java端?下面详细解释了这一点: JNI将本机代码使用的对象引用分为两类:本地引用和全局引用。本地引用在本机方法调用期间有效,并在本机方法返回后自动释放。全局引用在显式释放之前保持有效 因此,你的问题的答案取决于你在C++代码或全局引用中有一个本地引用。 对象作为本地引用传递给本机方法。JNI函数返回

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


我是否应该关心垃圾收集器破坏我的对象,因为它不再出现在
Java
端?

下面详细解释了这一点:

JNI将本机代码使用的对象引用分为两类:本地引用和全局引用。本地引用在本机方法调用期间有效,并在本机方法返回后自动释放。全局引用在显式释放之前保持有效

因此,你的问题的答案取决于你在C++代码或全局引用中有一个本地引用。 对象作为本地引用传递给本机方法。JNI函数返回的所有Java对象都是本地引用。JNI允许程序员从本地引用创建全局引用


这基本上意味着,除非您将得到的任何引用显式地转换为全局引用(使用
NewGlobalRef
),否则它们只会在JNI调用执行时被“引用”。因此,如果代码返回并且没有Java代码引用该对象,则可以对其进行垃圾收集。

您可以向我们展示一些相关的代码吗?如果您不担心代码中的对象,为什么要关心垃圾收集器的工作?这并不是说你在使用这个类。@BuhakeSindi-但是JNI代码仍然在使用它。不是专家,而是建议对象的全局引用将它保存在堆中。@Jonathan:我还没有写代码,这就是为什么我想知道。基本上,对象是一个图像,本机函数对图像进行了一些繁重的处理(但它在进行整个处理之前返回,因此需要将对象保存在内存中),多亏了这一点。不确定我是否理解了所有内容,但因为我希望我的对象即使在JNI调用返回后仍保留在内存中,而且在JNI调用后,Java代码中不再使用该对象,所以我需要使用全局引用?@hahaha1256:没错。如果不创建全局引用,那么一旦JNI调用返回,该引用将变得无效,并且该对象可能会被GCed。。