如果我不调用ReleaseStringUTFChars,它会在JNI调用结束时自动调用吗?
If I don't call ReleaseStringUTFChars, will it be automatically called at the end of the JNI call?
假设我使用 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(),但您需要安排它在某个时候被调用(除非您知道您即将退出)。
没有。本地对象引用引用自动释放。没有别的。
假设我使用 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(),但您需要安排它在某个时候被调用(除非您知道您即将退出)。
没有。本地对象引用引用自动释放。没有别的。