2010-11-21 12 views
0

JNI의 다차원 배열에 관한 이상한 동작을 발견했으며 몇 시간 동안 연구 한 후에도 문제를 해결하는 방법을 알지 못합니다. 다음과 같은 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 ~ 2MB 씩 증가합니다. C++ 부분에 메모리를 할당하고 결코 릴리스하지 않는 것 같지만, 어디에서 발생해야하는지 전혀 알지 못합니다.

마이클

답변

0

내 생각은 여기

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

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

것입니다