0
JNIの多次元配列に関するいくつかの奇妙な振る舞いを発見しました。数時間の研究の後、私はまだ私の問題をどのように解決するか分かりません。私は次のJNIコードを持っています:JNIのStrange Memory Behavoir
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++の部分にメモリを割り当てていて、それを公開していないようですが、どこでそれが起こるべきか分かりません。
マイケル