JNI内存泄露处理方法汇总
来源:互联网 发布:极品五笔2013优化版 编辑:程序博客网 时间:2024/05/01 19:03
在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);
0 0
- JNI内存泄露处理方法汇总
- JNI内存释放以及泄露处理方法汇总
- Tomcat内存泄露处理方法
- VC内存泄露处理方法
- jni开发 - JNI内存泄露
- jni内存泄露
- jni 内存泄露
- jni 内存泄露
- android jni 内存泄露
- JNI内存泄露
- Android 处理内存泄露的方法
- Android 处理内存泄露的方法
- Android 处理内存泄露的方法
- 【转载+补充】嵌入式内存泄露处理方法
- 关于JNI内存泄露问题
- android Jni AttachCurrentThread 内存泄露
- JNI开发之JNI内存泄露
- Android 处理内存泄露
- linux下objdump命令用法介绍及如何使用objdump命令进行反汇编
- liux下的三个时间
- Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
- 关于android中listview-adapter的viewholder及settag的探究
- 关于Application得到上下文,getApplicationContext方法 空指针问题。
- JNI内存泄露处理方法汇总
- 2015——致我那终将逝去的青春
- gradle持续集成部署问题
- Android中WebView与JS交互
- MyEclipse8.5中安装Spket插件
- 使用faster rcnn训练自己的模型
- 存储过程实例1:idc_oemp.prws_external_contacts_search
- linux命令学习
- 【hdu 1850】Being a Good Boy in Spring Festival