假设我使用 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/