栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从本机方法返回由JNI创建的本地引用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从本机方法返回由JNI创建的本地引用

JVM需要知道本机代码是否保留其对对象的引用。也就是说,如果对象被删除,C / C
++代码是否仍然可以尝试访问它(可能导致段错误)。带有全局引用的对象不会被垃圾收集,因为本机代码表明它可能仍需要它们。具有本地引用的对象可以被垃圾回收,因为创建引用的函数已经返回给java。具有弱全局引用的对象可以被垃圾回收,因为本机代码已表明它将使用IsSameObject来检查具有弱引用的对象是否已被垃圾回收,以便只有在未进行垃圾回收的情况下,该对象才能正确使用该对象。

回覆:

因此,这意味着New * Ref仅用于固定本机代码吗?JVM是否跟踪“本地引用”到将其分配给Java变量实例的地步?

跟踪本地引用,直到返回java。将其分配给java变量不会删除引用,尽管它将独立地防止该对象的垃圾回收。返回的值将在堆栈上具有引用,以防止垃圾回收,直到可以将其分配给java变量为止,这样就不需要返回的对象具有全局引用,除非本机代码可以在返回后访问同一对象。没有本地引用,JVM可能会在执行JNI函数时对对象进行垃圾收集,因为垃圾收集器在另一个线程中运行。通常,不需要显式调用New
Ref / Delete Ref作为

传递给本机方法的所有Java对象(包括那些作为JNI函数调用结果返回的Java对象)都将自动添加到注册表中(即给定本地引用)。

(引自
https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#implementing_local_references)

您可能需要这样做的情况。

在原始线程中将控制权返回给Java之后,本机函数会生成一个继续使用该对象的线程。

本机函数将引用的副本存储在某个全局变量中,以供后续从Java调用使用。

您想在函数运行时显式删除引用,以节省可能需要一段时间的函数。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/515260.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号