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

标签 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(),但它并未明确表示不这样做会造成内存泄漏,该内存泄漏会在程序运行期间持续存在。

最佳答案

I looked at 'Should you call ReleaseStringUTFChars if GetStringUTFChars returned a copy?', and while it claims you should always call ReleaseStringUTFChars(), it doesn't explicitly say that not doing so will create a memory leak that persists for the duration of the program.

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

关于c++ - 如果我不调用ReleaseStringUTFChars,它会在JNI调用结束时自动调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30704657/

相关文章:

c++ - 简单的指针问题(我不知道为什么我没有得到确切的解释)

C++ 将 NULL 和 NON-NULL 值转换为指针

sql - 平均 sal 然后按降序排序

sql - 如何选择多列,其中只有一列不同? (甲骨文数据库)

java无限循环调用datainputstream收到内存不足异常

c++ - 从 QWidget 上面的父级获取继承的样式表

c++ - 线程 id 分配有多整洁?

java - 从 PL/SQL block 返回值

.net - 任务管理器不同意 Process Explorer?

Linux 内核内存泄漏目前已修复