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调用使用。
您想在函数运行时显式删除引用,以节省可能需要一段时间的函数。



