Если вызывается JNI DeleteGlobalRef (), собирается ли соответствующий объект Java сборщик мусора? - PullRequest
10 голосов
/ 02 декабря 2010

Я имею в виду, что если я создаю глобальный ссылочный объект задания в C ++, а затем передаю его в некоторый 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?

Как это работает в JNI?Является ли «GlobalReference» на объекте просто счетчиком ссылок на объект, так что, если я освобождаю объект GlobalReference, он не обязательно собирает мусор, лежащий в основе объекта Java, до тех пор, пока все ссылки на него (такие как «родительский» объект otherExistingGlobalRef ссылаютсяа) ушли?

Если вы можете ответить на это и предоставить ссылку на некоторую официальную документацию по Java / Sun / Oracle, подкрепляющую ваш ответ, вы получаете бонусные баллы: -).

1 Ответ

12 голосов
/ 02 декабря 2010

DeleteGlobalRef () освобождает ссылку , а не объект.

Если это была последняя достижимая ссылка, то указанный объект доступен для сборки мусора.

Является ли "GlobalReference" для объекта просто счетчиком ссылок на объект

Нет.Это просто ссылка, которая остается в силе, пока вы не освободите ее явно.Сборка мусора в Java вообще не зависит от количества ссылок.

См. Также Документация Oracle по глобальным ссылкам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...