local reference table overflow 内存泄露
【摘要】
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)