在这种情况下,垃圾收集器是否会破坏我的对象?

时间:2015-01-28 16:55:45

标签: java garbage-collection java-native-interface

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

我是否应该关注垃圾收集器销毁我的对象,因为它不再出现在Java那边?

1 个答案:

答案 0 :(得分:6)

JNI Spec

详细说明了这一点
  

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

因此,您的问题的答案取决于您在C ++代码中的本地引用或全局引用。

  

将对象作为本地引用传递给本机方法。 JNI函数返回的所有Java对象都是本地引用。 JNI允许程序员从本地引用创建全局引用。

这基本上意味着除非你明确地将任何引用转换为全局引用(使用NewGlobalRef),否则它们只会被引用"只要JNI呼叫需要。因此,如果代码返回并且没有Java代码引用该对象,那么它可以被垃圾收集。