JNIメモリ漏洩処理方法概要
2107 ワード
c++のnewのオブジェクトはjavaを返さない場合はreleaseで削除する必要があります.そうしないとメモリが漏れます.NewStringUTF、NewObjectが含まれます.Javaに戻ってreleaseを必要としない場合、javaは自分で回収します.
メモリ漏洩はまずwindowsリソースマネージャから、プログラムの実行に伴ってメモリが増加する傾向を見ることができ、具体的にはhp jmeterで検出することができます.プログラムの実行時に、jvmパラメータ-Xrunhprof:heap=all、cutoff=0を加えてjava.hprof.txtを生成し、jmeterで開き、Metric->Residual Objects(Count)、未回収のオブジェクトを見ることができ、表示するオブジェクトを選択し、点Markで表示するオブジェクトを記録し、Window->New Windowで新しいウィンドウを開き、Metric->Reference Graph Treeで、次に、Find Immediatelyをクリックすると、オブジェクトがどこで参照されているかが表示されます.
全体的な原則:objectへのすべての参照を解放する
1.FindClass
2.NewString/NewStringUTF/NewObject/NewByteArray
たとえば、
env->DeleteLocalRef(ref);
3.GetObjectField/GetObjectClass/GetObjectArrayElement
4.GetByteArrayElementsとGetStringUTFchars
5.NewGlobalRef/DeleteGlobalRef
たとえば、
jstring jstr = env->NewStringUTF((*p).sess_id);
...
env->DeleteLocalRef( jstr);
jobject jobj = env->NewObject(clazz,midInit);
return jobj;
メモリ漏洩はまずwindowsリソースマネージャから、プログラムの実行に伴ってメモリが増加する傾向を見ることができ、具体的にはhp jmeterで検出することができます.プログラムの実行時に、jvmパラメータ-Xrunhprof:heap=all、cutoff=0を加えてjava.hprof.txtを生成し、jmeterで開き、Metric->Residual Objects(Count)、未回収のオブジェクトを見ることができ、表示するオブジェクトを選択し、点Markで表示するオブジェクトを記録し、Window->New Windowで新しいウィンドウを開き、Metric->Reference Graph Treeで、次に、Find Immediatelyをクリックすると、オブジェクトがどこで参照されているかが表示されます.
全体的な原則:objectへのすべての参照を解放する
1.FindClass
jclass ref= (env)->FindClass("java/lang/String");
env->DeleteLocalRef(ref);
2.NewString/NewStringUTF/NewObject/NewByteArray
たとえば、
jstring (*NewString)(JNIEnv*, const jchar*, jsize);
const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);
void (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
jstring (*NewStringUTF)(JNIEnv*, const char*);
const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);
void (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);
env->DeleteLocalRef(ref);
3.GetObjectField/GetObjectClass/GetObjectArrayElement
jclass ref = env->GetObjectClass(robj);
env->DeleteLocalRef(ref);
4.GetByteArrayElementsとGetStringUTFchars
jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy);
(*env)->ReleaseByteArrayElements(env,jarray,array,0);
const char* input =(*env)->GetStringUTFChars(env,jinput, &isCopy);
(*env)->ReleaseStringUTFChars(env,jinput,input);
5.NewGlobalRef/DeleteGlobalRef
jobject (*NewGlobalRef)(JNIEnv*, jobject);
void (*DeleteGlobalRef)(JNIEnv*, jobject);
たとえば、
jobject ref= env->NewGlobalRef(customObj);
env->DeleteGlobalRef(customObj);