【发布时间】:2013-09-11 03:58:16
【问题描述】:
我有一个 java 程序多次调用本机函数。我的问题是这个函数有内存泄漏,我为摆脱它所做的一切都会导致内存转储。任何帮助将不胜感激。
这是我的代码
JNIEXPORT void JNICALL Java_class_method_getInput
(JNIEnv *env, jobject obj)
{
if (inputIsAvailable)
{
int size = getBufferCurrentIndex();
size -= getBufferReadIndex();
size *= 2;
char *finalSendArray = new char[size];
getCommand(finalSendArray);
jbyteArray byteArray = env->NewByteArray(size / 2);
env->SetByteArrayRegion(byteArray, 0, size / 2, (jbyte*) finalSendArray);
while(methodID == 0)
{
jclass cls = env->GetObjectClass(obj);
methodID = env->GetMethodID(cls, "setCommand", "([B)V" );
}
env->CallVoidMethod(obj, methodID, byteArray);
//env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
我的问题是上面的 ^ 代码如果未注释会导致内存转储,如果未取消注释,我的程序会在几分钟内耗尽内存
env->DeleteLocalRef(byteArray);
delete[] finalSendArray;
}
}
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
先释放
byteArray,再删除底层内存? -
我的回复解决了您的问题吗?如果确实如此,请将其标记为正确。你为什么要在 C 中做这一切? getCommand 是做什么的?可以在java中完成吗? jni 很贵。
-
@JustinDanielson 嘿抱歉这么久才回复,我的某个地方仍有泄漏。我不确定在哪里。我正在使用 c++,因为我只是在重用已经构建的代码。它可以用 Java 重写,但我更愿意将它保留在当前的实现中。
-
@KerrekSB 我希望这有效......但不幸的是它没有。
-
很抱歉。我真的不知道;我能给出的唯一建议是仔细阅读 JNI 规范并确保您了解所有不同的生命周期和依赖关系。
标签: java c++ memory-leaks java-native-interface