java - 字节数组的 JNI 内存泄漏

标签 java c++ memory-leaks java-native-interface

我有一个 java 程序多次调用 native 函数。我的问题是这个函数有内存泄漏,我为摆脱它所做的一切都会导致内存转储。任何帮助将不胜感激。

这是我的代码

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;
    }
}

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

如果您使用 JNI_ABORT 参数,ReleaseByteArrayElements 也将释放内存。因此,当您稍后执行删除和释放时,其中一个指针指向导致转储的未初始化内存。

其中一个会起作用,我相当确定它是第一个起作用的。

env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
delete[] finalSendArray;

如果第一个失败,试试这个。

env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
env->DeleteLocalRef(byteArray);

在 ReleaseByteArrayElements 之后放置一个 print 语句,您将看到您的程序执行超出该命令并在 Release/Delete[] 上崩溃

Search for "Table 4-10 Primitive Array Release Modes"

关于java - 字节数组的 JNI 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18668135/

相关文章:

c++ - LIB 不需要额外的依赖项,但 DLL 需要额外的依赖项

c++ - inline static auto 的 Initializer "sizeof(T)"...是否需要实例化?

c++ - 使用 C++ 套接字时无法接收到多个消息

node.js - 检测到可能的 EventEmitter 内存泄漏

c - 使用指针的二维数组 - 内存泄漏

java - 鼠标点击监听器不触发

java - 如何获取ListView中被点击项目的路径

java - JMX - Pivotal Cloud Foundry

java - 如何获取全局当前的键盘状态? (即,无论查询应用程序是否具有焦点,当前按下的是哪些键)

java - JdbcRowSet 中的内存泄漏