JVM主机应用程序中的JNI本地ref生命周期

时间:2016-10-28 16:44:27

标签: java jvm java-native-interface

JNI文档声明本地Java对象引用在范围内,直到本机方法返回为止;他们也是该线程的本地人。

当应用程序托管Java VM时,可以在任何本机方法之外创建Java对象引用。一旦JVM运行,主机应用程序可以获得JNIEnv并创建它想要的所有Java对象。假设这种情况产生了本地参考。

请问这些人的生命周期是什么?只要JVM存在,它们是否存活(除非明确释放)?他们也是本地人吗?如果在工作线程上,一旦线程与JVM分离,它们是否会超出范围?

特别是关于线程局部性:到目前为止,在线程之间重用类对象(从FindClass()返回)将对我有效。但这违反了JNI规则吗?

1 个答案:

答案 0 :(得分:3)

可以通过以下方式获得可用于创建本地参考的有效JNIEnv

  1. 本机方法调用。在方法返回之前,本地引用将一直有效。
  2. JVMTI回调。同样,本地引用将一直存在,直到回调返回。
  3. GetEnv致电。

    3.1。来自JNI_OnLoadAgent_OnLoadAgent_OnAttach条目。在这些条目中创建的本地引用在从条目返回之前有效。

    3.2。来自AttachCurrentThread函数附加的线程。在调用DetachCurrentThread之前,引用将一直存在。

  4. 所有本地参考都是only valid in the thread,在其中创建它们。本机代码不能将本地引用从一个线程传递到另一个线程。

    请注意,JVM保证 12 可以在一个帧中创建16个本地引用。如果您需要更多本地参考,则必须使用PushLocalFrame / PopLocalFrame JNI函数明确管理它们。

    jclassjthreadjstringjarray等都是JNI references,如jobject。它们也需要进行管理,而不是jmethodIDjfieldID,而不是JNI引用。