local reference table overflow 内存泄露

举报
风吹稻花香 发表于 2021/06/05 00:38:31 2021/06/05
【摘要】 local reference table overflow JNI层coding经常会遇到ReferenceTable overflow问题,特别是当jni函数被反复调用上千上万次的时候,现汇总如下,未完待续,并欢迎补充,(*^__^*) 嘻嘻…… 总体原则:释放所有对object的引用 1.FindCl...
local reference table overflow
JNI层coding经常会遇到ReferenceTable overflow问题,特别是当jni函数被反复调用上千上万次的时候,现汇总如下,未完待续,并欢迎补充,(*^__^*) 嘻嘻……

总体原则:释放所有对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
jbyte* array= (*env)-> GetByteArrayElements(env,jarray,&isCopy);
(*env)-> ReleaseByteArrayElements(env,jarray,array,0);
4.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);

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/61419704

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。