如果调用JNI DeleteGlobalRef(),相应的java对象是否会被垃圾回收?

我的意思是,如果我在C ++中创建一个全局引用jobject,然后将其传递给某些Java代码,并删除调用DeleteGlobalRef(),那么底层的java对象是否可能立即被垃圾收集,以便任何未来的Java代码已经引用该对象可能会返回NullPointerException? 具体来说,如果我有一些C ++代码执行类似这样的简化示例:

static jobject myObjGlobalRef; static JNIEnv* env = /* call to create a JVM and get the JNI env */; jobject ReturnMyObj() { /* <> */ jobject localObj = env->NewObject(class, constructorId, param1); myObjGlobalRef = env->NewGlobalRef(localObj); } void DeleteMyObj() { env->DeleteGlobalRef(myObjGlobalRef); } myObjGlobalRef = ReturnMyObj(); jobject otherExistingGlobalRef = /* Assume we get another global ref to another parent obj somewhere else */ /* ... other code here ... */ // Invoke some method on some other pre-existing global reference that uses // myObjGlobalRef, lets assume this method stores the object referenced by // myObjGlobalRef into a parent object referenced by otherExistingGlobalRef: env->CallVoidMethod(env, otherExistingGlobalRef, addASubObjectMethodId, myObjGlobalRef); DeleteMyObj(); // Does the pointed to by myObjGlobalRef still exist here, assuming that // otherExistingGlobalRef now references it? 

这在JNI中如何运作? 对象上的“GlobalReference”只是对象的引用计数,因此如果我释放GlobalReference jobject,它不一定是垃圾收集底层java对象,直到所有引用它(例如“父”对象otherExistingGlobalRef引用它已经消失了?

如果你能回答这个并提供一些官方Java / Sun / Oracle文档的链接来备份你的答案,你将获得奖励:-)。

DeleteGlobalRef()释放引用 ,而不是对象。

如果这是最后一个可到达的引用,则引用的对象可用于垃圾回收。

对象上的“GlobalReference”只是对象的引用计数

不。它只是一个参考,在你明确释放它之前一直有效。 Java的垃圾收集根本不依赖于引用计数。

另请参阅Oracle有关全局引用的文档 。