如果我不调用ReleaseStringUTFChars,它会在JNI调用结束时自动调用吗?

时间:2015-06-08 08:44:34

标签: c++ oracle memory-leaks java-native-interface

我们说我使用GetStringUTFChars()分配了一个字符串,但后来我没有发布它:

JNIEXPORT void JNICALL Java_Sample1_nativeFunc
  (JNIEnv *env, jclass, jstring s)
{
    const char *utf = env->GetStringUTFChars(s, 0);
    // env->ReleaseStringUTFChars(s, buf);
}

字符串会在JNI调用结束时自动释放吗?也就是说,内存泄漏只会在JNI调用期间持续存在,还是会在之后保留?

我问,因为实现这么简单,我无法相信JVM实现不会这样做 - 它可以跟踪最后需要发布的内存JNI调用,如果程序员没有这样做,则自动释放它。

它是否依赖于JVM实现?如果是这样,我就会询问Oracle的JVM。我查看了Should you call ReleaseStringUTFChars if GetStringUTFChars returned a copy?,虽然它声称您应该始终致电ReleaseStringUTFChars(),但它并没有明确表示不这样做会造成在程序持续时间内持续存在的内存泄漏。 / p>

2 个答案:

答案 0 :(得分:1)

  

我看了'如果GetStringUTFChars你应该调用ReleaseStringUTFChars吗?   还是寄了一份?',虽然它声称你应该随时打电话   ReleaseStringUTFChars(),它没有明确地说不这样做   将创建一个内存泄漏,持续一段时间   程序

我认为这意味着如果没有调用ReleaseStringUTFChars(),那么内存将不会被回收。 JNI无法自动回收内存,因为您的代码可能保留了指向它的指针(可能用于下一次调用)。没有必要从与get()相同的堆栈帧调用release(),但是你需要安排它在某个时刻被调用(除非你知道你将要退出)。

答案 1 :(得分:0)

没有。本地对象rferences引用会自动释放。没别了。