JNI中的奇怪记忆行为

时间:2010-11-21 11:55:11

标签: memory-leaks multidimensional-array java-native-interface

我在JNI中发现了一些关于多维数组的奇怪行为,经过数小时的研究后我仍然不知道如何解决我的问题。我有以下JNI代码:

JNIEXPORT jobject JNICALL Java_leaktest_NativeClass_nativeCalculation
  (JNIEnv *env, jobject thiz, jobjectArray arr) {

    double** multidimArray = new double*[512];

    for (int i = 0;i < 512;i++) {
        multidimArray[i] = new double[512];

        for (int j = 0;j < 512;j++) {
            multidimArray[i][j] = i * j;
        }
    }

    jobjectArray jMultidimArray = env->NewObjectArray(512, env->FindClass("[D"), 0);

    for (int i = 0;i < 512;i++) {
        jdoubleArray row = env->NewDoubleArray(512);

        jdouble* elems = (jdouble*)multidimArray[i];

        env->SetDoubleArrayRegion(row, 0, 512, elems);
        env->SetObjectArrayElement(jMultidimArray, i, row);

        env->DeleteLocalRef(row);
    }

    jclass arrayClass = env->FindClass("leaktest/ArrayClass");

    jobject arrObj = env->NewObject(arrayClass, env->GetMethodID(arrayClass, "<init>", "(II[[D)V"), 512, 512, jMultidimArray);

    for (int i = 0;i < 512;i++) {
        delete multidimArray[i];
    }

    delete multidimArray;

    return arrObj;
}

在Java中,我只是反复调用这个本机方法。每次调用时,JVM占用的RAM量都会增加大约1到2 MB。在我看来,我在某个地方在C ++部分分配内存并且永远不会释放它,但我不知道应该在哪里发生。

迈克尔

1 个答案:

答案 0 :(得分:0)

我的猜测是它会在这里

jclass arrayClass = env->FindClass("leaktest/ArrayClass");

jobject arrObj = env->NewObject(arrayClass, env->GetMethodID(arrayClass, "<init>", "(II[[D)V"), 512, 512, jMultidimArray);

jobject arrObj = env->NewObject(arrayClass, env->GetMethodID(arrayClass, "<init>", "(II[[D)V"), 512, 512, jMultidimArray);