Ogr*_*m33 11 c++ java java-native-interface
我的意思是,如果我在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()
{
/* <<Code that defines class, constructorId, and param1 goes here>> */
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?
Run Code Online (Sandbox Code Playgroud)
这在JNI中如何运作?对象上的"GlobalReference"只是对象的引用计数,因此如果我释放GlobalReference jobject,它不一定是垃圾收集底层java对象,直到所有引用它(例如"父"对象otherExistingGlobalRef引用它已经消失了?
如果您可以回答这个问题并提供一些支持您的答案的官方Java/Sun/Oracle文档的链接,那么您将获得奖励:-).
And*_*mas 13
DeleteGlobalRef()释放引用,而不是对象.
如果这是最后一个可到达的引用,则引用的对象可用于垃圾回收.
对象上的"GlobalReference"只是对象的引用计数
不.它只是一个参考,在你明确释放它之前一直有效.Java的垃圾收集根本不依赖于引用计数.
另请参阅Oracle有关全局引用的文档.