企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在大多数情况下,你不需要关心局部引用的声明周期,Java虚拟机会自动为你释放。当然,在某些场景下为了避免过高的内存使用, 你需要显式的释放局部引用。考虑如下场景: 你需要在一个Native函数中创建大量的局部引用,这将会导致JNI局部引用表的溢出。在局部引用不需要被继续使用的时候释放它是一个好主意。例如,以下程序段中,在大量字符串数组上循环。每一次迭代之后,应当显式的释放字符串元素对应的局部引用: ~~~ for (int i = 0; i < len; ++i) { jstring jstr = (*env)->GetObjectArrayElement(env, arr, i); /* ... process jstr */ (*env)->DeleteLocalRef(env, jstr); } ~~~ 你的Native函数压根就没有返回(或者在很长一段时间内都不会返回)。例如,一个Native函数里边可能执行一个无限的事件分派循环。在这个循环中创建的每一个局部引用都应当在不会被使用到的第一时间被立刻释放。 你的Native函数访问了一个很大的对象,因此创建了指向这个对象的一个引用。接下来你的Native函数执行了大量的计算(消耗了大量时间),然后才返回。那么在很长一段时间内这个被引用的大对象都不能够被及时的释放,所以应当在使用完它之后的第一时间释放掉它。 ~~~ /* A native method implementation */ JNIEXPORT void JNICALL Java_pkg_Cls_func(JNIEnv *env, jobject this) { lref = .. / *a large Java Object */ ... /* last use of lref*/ (*env)->DeleteLocalRef(env, lref); lengthyComputation();/* may take some time */ return; /* all local refs are freed */ } ~~~