c - JNI NewDoubleArray 内存泄漏

标签 c memory-leaks java-native-interface

我有 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好像并没有释放他。

我已关注thisthis但我没有找到阻止内存泄漏的正确方法。

我尝试将其更改为全局引用, 也尝试在线程内执行此操作并尝试将其分离,但仍然收到相同的结果。

最佳答案

这不是泄漏。 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/

相关文章:

比较子集的集合直到排列

c - 需要对近乎无限的数据点集进行 FFT

c# - 我是否需要在每次 'foreach' 迭代时释放 COM 对象?

c# - 从 Java 调用 C# dll

java - JNI - 类内类的 GetObjectField 失败

C:如何递归地逐位传输字节?

c - 如何在数组中获取带编号的变量名?

Cocoa开发: malloc: free_garbage: garbage ptr = 0x18a15e0,有非零refcount = 1错误

javascript - VUE 在路由之间使用三个 JS 释放内存

java - 执行gradle build时需要执行自定义Task