jni ReferenceTable overflow

频繁点击一个按钮,程序崩溃,查看log部分详情如下:

04-11 11:10:40.371: W/dalvikvm(5507): ReferenceTable overflow (max=1024)
04-11 11:10:40.371: W/dalvikvm(5507): JNI pinned array reference table (0x6242b008) dump:
04-11 11:10:40.371: W/dalvikvm(5507):   Last 10 entries (of 1024):
04-11 11:10:40.371: W/dalvikvm(5507):      1023: 0x42e97298 int[] (456 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1022: 0x41c16618 int[] (69 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1021: 0x42e5ef28 byte[] (1280 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1020: 0x4230da28 byte[] (119 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1019: 0x422a03f0 byte[] (14 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1018: 0x42efced0 byte[] (1920 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1017: 0x422bc570 byte[] (119 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1016: 0x41f52e68 byte[] (14 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1015: 0x423c41d0 byte[] (119 elements)
04-11 11:10:40.371: W/dalvikvm(5507):      1014: 0x422b8bf0 byte[] (14 elements)
04-11 11:10:40.371: W/dalvikvm(5507):   Summary:
04-11 11:10:40.371: W/dalvikvm(5507):        20 of byte[] (12 elements) (20 unique instances)
04-11 11:10:40.371: W/dalvikvm(5507):         1 of byte[] (13 elements)
04-11 11:10:40.371: W/dalvikvm(5507):       489 of byte[] (14 elements) (489 unique instances)
04-11 11:10:40.371: W/dalvikvm(5507):         1 of byte[] (68 elements)
04-11 11:10:40.371: W/dalvikvm(5507):         3 of byte[] (69 elements) (3 unique instances)
04-11 11:10:40.371: W/dalvikvm(5507):       486 of byte[] (119 elements) (486 unique instances)
04-11 11:10:40.371: W/dalvikvm(5507):        10 of byte[] (148 elements) (10 unique instances)
04-11 11:10:40.371: W/dalvikvm(5507):        10 of byte[] (152 elements) (10 unique instances)
04-11 11:10:40.371: W/dalvikvm(5507):         1 of byte[] (1280 elements)
04-11 11:10:40.371: W/dalvikvm(5507):         1 of byte[] (1920 elements)
04-11 11:10:40.371: W/dalvikvm(5507):         1 of int[] (69 elements)
04-11 11:10:40.371: W/dalvikvm(5507):         1 of int[] (456 elements)
04-11 11:10:40.371: E/dalvikvm(5507): Failed adding to JNI pinned array ref table (1024 entries)
04-11 11:10:40.371: I/dalvikvm(5507): "main" prio=5 tid=1 RUNNABLE

主要问题是ReferenceTable overflow 。查看资料,发现是引用计数器溢出了,最大为1024.即java的内存管理机制是基于引用的,需要计数器来记录引用的次数。在overflow这句话下面dump出了最近的10个引用,Summary下面可以看出有哪些引用。可以发现其中有两组byte[],每组的引用达到480多次。我恍然大悟,每点击一次按钮,引用一次,下次点击时上次的资源未被释放。于是一直累加直至计数器溢出。

检查代码发现:

int nArrLen_u = env->GetArrayLength(jbUrl);
    if(nArrLen_u > 0){

        pUrl = (char *)malloc(nArrLen_u + 1);
        bzero(pUrl, (nArrLen_u + 1));
        jU = env->GetByteArrayElements(jbUrl, NULL);
        memcpy(pUrl, jU, nArrLen_u);
    }

    int nArrLen_x = env->GetArrayLength(jbXml);
    if(nArrLen_x > 0){

        pXmlBuf = (char *)malloc(nArrLen_x + 1);
        bzero(pXmlBuf, (nArrLen_x + 1));
        jX = env->GetByteArrayElements(jbXml, NULL);
        memcpy(pXmlBuf, jX, nArrLen_x);
    }

代码上可以看出我调用了两次 GetByteArrayElements 但是却没有释放掉。所以在最后添上释放语句就解决了~

if(nArrLen_u > 0){
        env->ReleaseByteArrayElements(jbUrl,jU,0);
    }
    if(nArrLen_x > 0){
        env->ReleaseByteArrayElements(jbXml,jX,0);
    }

参考Android NDK之JNI陷阱 在用到NewByteArray类似方法时一定要DeleteLocalRef(),使用GetByteArrayElements时 要用ReleaseByteArrayElements来进行释放。

问题就是答案!真正明白是什么问题之后,也就找到了答案。

时间: 2024-10-12 03:20:05

jni ReferenceTable overflow的相关文章

JNI ReferenceTable overflow泄露问题

INFO [ 225716.880557] (8065:11668) socket msgid:0 WARN [ 225716.880557] (8065:11669) dalvikvm ReferenceTable overflow (max=1024) WARN [ 225716.880557] (8065:11669) dalvikvm JNI pinned array reference table (0x76292450) dump: WARN [ 225716.880557] (80

在android中调用jni,出现ReferenceTable overflow (max=1024)

转:http://m.blog.csdn.net/blog/redouba/20624631 最近在做android监控方面的项目,在调用.so库解码的时候,运行时间长了就会报出 ReferenceTable overflow (max=1024)的错误.然后再网上搜啊搜,大致的结果就是没有释放资源种种.. 参考资料: 问题来源: 写了一个较为复杂的Native so库,里面使用了链表,从链表中取出数据,装载到Java LinkedList中. 当测试数据较小的时候还没有问题,当测试数据达到一定

mixare的measureText方法在频繁调用时抛出“referencetable overflow max 1024”的解决方式

这几天在搞基于位置的AR应用,採用了github上两款开源项目: mixare android-argument-reality-framework 这两个项目实现机制大致同样.我选取的是android-argument-reality-framework.原因是我觉得他的代码结构要清晰非常多(纯属个人意见). 这两个项目的demo在执行时都会crash,通过查看控制台,能够看到例如以下信息: 07-31 14:35:38.685: W/dalvikvm(13686): ReferenceTab

jni 修bug

1. ReferenceTable overflow (max=512)  内存泄露,程序运行一段时间就挂掉了. 在利用反射调用java中的函数需要释放掉查找到的类 void publishJavaProgress(JNIEnv * env, jobject obj, jint progress) { jclass   clazz   =   (*env)->FindClass(env,"com/itcast/lame/LameActivity"); //String if (c

cocos2dx获得字体的宽高

Android: 1.在CCImage中添加下面的方法: //头文件声明略. cocos2d::CCSize CCImage::getStringSize(const char *text, const char * pFontName, int nSize) { JniMethodInfo minfo; if (! JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/lib/Cocos2dxBitmap", "getFon

Android JNI局部引用表溢出:local reference table overflow (max=512)

<JNI/NDK开发指南(十)——JNI局部引用.全局引用和弱全局引用>这篇文章中详细介绍了在JNI中三种引用的使用方式,区别.应用场景和开发注意事项.由于都是理论,看完之后可能印象不够深刻,由其是在开发当中容易出错的地方.所以这篇文章用一个例子说明引用使用不当会造成的问题,以... songtaste.com/user/10271950/infosongtaste.com/user/10271975/infosongtaste.com/user/10271978/infosongtaste.

JNI局部引用表溢出:local reference table overflow (max=512)

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44873769 在<JNI/NDK开发指南(十)--JNI局部引用.全局引用和弱全局引用>这篇文章中详细介绍了在JNI中三种引用的使用方式,区别.应用场景和开发注意事项.由于都是理论,看完之后可能印象不够深刻,由其是在开发当中容易出错的地方.所以这篇文章用一个例子说明引用使用不当会造成的问题,以引起大家对这个知识点的重视. 首先创建一个Android工程,在主界面放一个文本框和一个按钮,

JNI内存泄露JNI ERROR (app bug): local reference table overflow (max=512)

原因是没即时释放对象,原本的代码是这样 static jobject getMaps(JNIEnv *env,jclass obj) { jclass stringbuilder_class = (*env)->FindClass(env,"java/lang/StringBuilder"); jmethodID init_stringbuilder_Method = (*env)->GetMethodID(env,stringbuilder_class,"<

Android调用JNI本地方法经过有点改变

方法注册好后要经过哪些路 Android一个异常捕获项目 https://github.com/xroche/coffeecatch coffeecatch CoffeeCatch, a tiny native POSIX signal catcher (especially useful for JNI code on Android/Dalvik, but it can be used in non-Java projects) It allows to "gracefully"