A WeakReference
- это объект Java с обычной ссылкой на него. содержит ссылку на другой объект.Это содержащаяся ссылка, которая является «слабой», а не ссылка на саму WeakReference
.
Так что, когда вы вызываете env->NewGlobalRef(weak_this)
(предполагая, что weak_this
является WeakReference
), эффект являетсятак же, как присвоение weak_this
статическому.Это не приводит к тому, что ссылка на объект , содержащаяся в WeakReference
, является полностью достижимой.
Я думаю, что вы, возможно, неправильно истолковываете то, что говорит вам профилировщик памяти.В частности, я ожидаю, что он покажет содержащуюся ссылку WeakReference
, которая будет достижимой ... до тех пор, пока GC не решит разорвать связь.Попробуйте поэкспериментировать с WeakReference
в обычной переменной static
.
ОБНОВЛЕНИЕ
Я начинаю думать, что это нормальное поведение дляJNI NewGlobalRef
.Документация JNI (как всегда) очень расплывчата в отношении поведения метода.
Обратите внимание, что существует также метод JNI, называемый NewGlobalWeakRef
;см. http://java.sun.com/docs/books/jni/html/refs.html#27531. Если ничего другого, NewGlobalWeakRef
предоставляет альтернативный способ делать то, что вы пытаетесь сделать.