2023-01-20 280
由于根据此线程泄漏我的本机代码,我不断遇到此错误:
referencetable溢出(max = 512)jni
然而,在我看来,artycurrentThread泄漏.我尝试了此代码,然后泄漏
// this code LEAKS!
// C++:
void Engine::UpdateCamera(float x, float y, float z) {
JNIEnv *jni;
app_->activity->vm->AttachCurrentThread(&jni, NULL);
//Do nothing
app_->activity->vm->DetachCurrentThread();
return;
}
// Java
public void updateCamera(final float x, final float y, final float z) {
if (_label2 == null)
return;
StackTraceElement trace = new Exception().getStackTrace()[0];
Log.e(APP_TAG, "Called:" +
trace.getClassName() + "->" + trace.getMethodName() + ":" + trace.getLineNumber());
}
然后,我简单地评论了所有内容,该程序停止泄漏并永远运行:(
// this code never leaks, but it does not do anything either
void Engine::UpdateCamera(float x, float y, float z) {
JNIEnv *jni;
//app_->activity->vm->AttachCurrentThread(&jni, NULL);
//app_->activity->vm->DetachCurrentThread();
return;
}
是否有人经历了attachcurrentthread的泄漏问题?
谢谢.
您是否连接到调试器?如果是这样,请断开连接,您可能会发现弱参考表返回到合理的值.
我也有同样的问题;如果我与调试器一起运行,则会发生.
以下attatchTestMemoryLeak()功能具有本机内存泄漏,我仍然没有找出原因,但是我确实找到了另一种方法来避免本机内存泄漏;请参阅函数attatchTestOK();
//c++ code
void attatchTestMemoryLeak(){
for(int i=0; i<100000; i++){
JNIEnv *env= nullptr;
//native thread try to attach java environment;
int getEnvStat = g_VM->GetEnv((void **)&env,JNI_VERSION_1_4);
if (getEnvStat == JNI_EDETACHED) {
jint attachStat=g_VM->AttachCurrentThread(&env, NULL);
if (attachStat == JNI_OK) {
LOG_E("index=%d, attach ok",i);
}else{
LOG_E("index=%d, attach failed",i);
}
}
//do something, call java function;
//Detatched the native thread from java environment;
jint detachStat=g_VM->DetachCurrentThread();
if(detachStat==JNI_OK){
LOG_E("detach ok, index=%d, detachStat=%d",i,detachStat);
}else{
LOG_E("detach failed, index=%d,detachStat=%d",i,detachStat);
}
env = NULL;
}
}
以下功能正常工作, 给出解释.
static pthread_key_t detachKey=0;
void detachKeyDestructor(void* arg)
{
pthread_t thd = pthread_self();
JavaVM* jvm = (JavaVM*)arg;
LOG_E("detach thread, thd=%u",thd);
jvm->DetachCurrentThread();
}
void attachTestOK(){
for (int i = 0; i < 1000000; i++)
{
JNIEnv *env= nullptr;
int getEnvStat = g_VM->GetEnv((void **)&env,JNI_VERSION_1_4);
if (getEnvStat == JNI_EDETACHED) {
if (detachKey == 0){
LOG_E("index=%d,create thread key",i);
pthread_key_create(&detachKey, detachKeyDestructor);
}
jint attachStat=g_VM->AttachCurrentThread(&env, NULL);
pthread_setspecific(detachKey, g_VM_Test);
if (attachStat == JNI_OK) {
LOG_E("index=%d, attach ok",i);
}else{
LOG_E("index=%d, attach failed",i);
}
}
LOG_E("index=%d, getEnvStat=%d",i,getEnvStat);
//do something, call java function;
env = NULL;
}
}
以上所述是小编给大家介绍的"JNI ERROR (app bug): 弱全局引用表溢出" 为什么?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25990.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态