我有 Java 应用程序,它使用带有 JNI 的 C 库。
我向 JNI 发送一个字符串并希望他返回 jdoubleArray。
JNIEXPORT jdoubleArray JNICALL Java_com_1funcA (JNIEnv *env, jclass class, jstring text){
const char *a = (*env)->GetStringUTFChars(env, text, 0);
char *b;
funcB(a, &b);
c_array c;
c.data = b;
c.count = strlen(b);
d_array d = funcA(c);
(*env)->ReleaseStringUTFChars(env, text, a);
jdoubleArray java_buffer = (*env)->NewDoubleArray(env, d.count);
(*env)->SetDoubleArrayRegion(env, java_buffer, 0, d.count, d.doubleArr);
free(d.doubleArr);
free(b);
return java_buffer;}
它按预期工作,但这些行存在内存泄漏。
jdoubleArray java_buffer = (*env)->NewDoubleArray(env, d.count);
java_buffer被返回到java所以我不能在这里释放它。 而且GC好像并没有释放他。
我已关注this和 this但我没有找到阻止内存泄漏的正确方法。
我尝试将其更改为全局引用, 也尝试在线程内执行此操作并尝试将其分离,但仍然收到相同的结果。
最佳答案
这不是泄漏。 NewDoubleArray
创建本地引用。如https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#local_references声明“本地引用在 native 方法调用期间有效。”当 native 方法返回时,本地引用将被删除。 Java 端为其创建一个新的引用,因此它不会太快被垃圾回收。一旦 Java 也不再引用该对象,它将有资格进行垃圾回收。
请注意,如果您创建一个全局引用并且不再删除它,您确实会造成泄漏。
关于c - JNI NewDoubleArray 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39268722/