JNIでCライブラリを使用するJavaアプリケーションがあります。JNI NewDoubleArrayメモリリーク
私はJNIに文字列を送り、jdoubleArrayを返すようにします。
JNIEXPORT jdoubleArray JNICALL Java_com_1funcA (JNIEnv *env, jclass class, jstring text){
const char *a = (*env)->GetStringUTFChars(env, text, 0);
char *b;
funcB(a, &b);
c_array c;
c.data = b;
c.count = strlen(b);
d_array d = funcA(c);
(*env)->ReleaseStringUTFChars(env, text, a);
jdoubleArray java_buffer = (*env)->NewDoubleArray(env, d.count);
(*env)->SetDoubleArrayRegion(env, java_buffer, 0, d.count, d.doubleArr);
free(d.doubleArr);
free(b);
return java_buffer;}
これらの行からはメモリリークがあります。
jdoubleArray java_buffer = (*env)->NewDoubleArray(env, d.count);
java_bufferがjavaに返されるので、ここでそれを解放できません。 それはGCが彼を解放しないようです。
私はthisとthisをフォローしましたが、メモリリークを防ぐ正しい方法が見つかりません。
グローバル参照に変更しようとしましたが、 もスレッド内でこれを実行しようとしましたが、デタッチしようとしましたが、依然としてsames結果を受け取ります。
メモリリークがあるとはどのように判断しましたか(それは誤検出ではありません)? – Michael
私はwhile(true)でJavaアプリケーションを実行し、メモリ使用量がいっぱいになり、最終的に1時間後にクラッシュしました。 –