弱引用的NewGlobalRef仍然可以防止对象被垃圾回收

 2023-01-21    271  

问题描述

要实现从本机代码到Java代码的回调函数,我必须使用NewGloabRef创建一个全局参考.从内存配置文件中,我发现,一旦我打电话给env->NewGlobalRef(weak_this),即使是播放器对象的薄弱引用,播放器对象也将作为根对象可用,我认为这将阻止其被收集到垃圾.

,但我的理解是弱参考不会阻止对物体收集垃圾.

弱引用的NewGlobalRef仍然可以防止对象被垃圾回收

//java code

Player{

native_init(new WeakReference(this)),

}

//JNi code

//listener 
Listener::Listener(jobject weak_this)
{

//will use mObject for callback 
mObject = env->NewGlobalRef(weak_this);

}


xxxx_Player_native_init(xxxx. Object weak_this)
{

Listener l = new Listener(weak_this);

}

编辑:

内存配置文件:

Root Object 0x2C820E10 <com/trident/tv/media/player/JniTPlayer>
  com/trident/tv/media/player/JniTPlayer.trace : 0x2C83CC54 <java/lang/String>
  com/trident/tv/media/player/JniTPlayer.listenerList : 0x2C820E64 <java/util/Vector>

jni的日志

[JNI] NewGlobalRef(0x2C820E10 [com/trident/tv/media/player/JniTPlayer]) : 0x2C820E10

推荐答案

a WeakReference是一个具有普通引用的Java对象.它包含对另一个对象的引用.它是”弱”所包含的引用,而不是对WeakReference本身的引用.

因此,当您调用env->NewGlobalRef(weak_this)(假设weak_this为WeakReference)时,效果与将weak_this分配给静态.它不会导致包含WeakReference包含的对象引用可靠.

我认为您可能正在误解记忆profiler告诉您的内容.特别是,我希望它可以显示A WeakReference的包含参考,直到GC决定打破链接为止.尝试在普通static变量中使用WeakReference的实验.


更新

我开始认为这是JNI NewGlobalRef的正常行为. JNI文档(一如既往)对该方法的行为非常含糊.

请注意,还有一种称为NewGlobalWeakRef的JNI方法;参见 http://java.sun.com/docs/books/books/books/jni/html/refs.html#27531 .如果没有别的,NewGlobalWeakRef提供了做您要做的事情的替代方法.

以上所述是小编给大家介绍的弱引用的NewGlobalRef仍然可以防止对象被垃圾回收,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26299.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。