JNI内存泄露处理方法汇总

在c++中new的对象,如果不返回java,必须用release掉,否则内存泄露。包括NewStringUTF,NewObject。如果返回java不必release,java会自己回收。

[cpp]  view plain  copy
  1. jstring jstr = env->NewStringUTF((*p).sess_id);  
  2.    ...  
  3. env->DeleteLocalRef( jstr);  
  4.   
  5. jobject jobj = env->NewObject(clazz,midInit);  
  6. 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 
[cpp]  view plain  copy
  1. jclass ref= (env)->FindClass("java/lang/String");  
  2.   
  3. env->DeleteLocalRef(ref);   

2.NewString / NewStringUTF / NewObject / NewByteArray

例如,
[cpp]  view plain  copy
  1. jstring     (*NewString)(JNIEnv*, const jchar*, jsize);     
  2.   
  3. const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);  
  4. void        (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);  
  5.   
  6. jstring     (*NewStringUTF)(JNIEnv*, const char*);     
  7.   
  8. const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);  
  9. void        (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);  

env->DeleteLocalRef(ref); 

3.GetObjectField/GetObjectClass/GetObjectArrayElement

[cpp]  view plain  copy
  1. jclass ref = env->GetObjectClass(robj);  
  2.   
  3. env->DeleteLocalRef(ref);  
 
4.GetByteArrayElements和GetStringUTFChars
[cpp]  view plain  copy
  1. jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy);  
  2. (*env)->ReleaseByteArrayElements(env,jarray,array,0);  
  3.   
  4. const char* input =(*env)->GetStringUTFChars(env,jinput, &isCopy);  
  5. (*env)->ReleaseStringUTFChars(env,jinput,input);  

5.NewGlobalRef/DeleteGlobalRef

[cpp]  view plain  copy
  1. jobject     (*NewGlobalRef)(JNIEnv*, jobject);  
  2. void        (*DeleteGlobalRef)(JNIEnv*, jobject);  

例如,

[cpp]  view plain  copy
  1. jobject ref= env->NewGlobalRef(customObj);  
  2. env->DeleteGlobalRef(customObj);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值