今天在小米设备上遇到如下问题

       10-15 17:04:36.899: W/dalvikvm(2767): ReferenceTable overflow (max=512)

      10-15 17:04:36.909: W/dalvikvm(2767): JNI local reference table summary (512 entries):

      10-15 17:04:36.909: W/dalvikvm(2767): Memory held directly by tracked refs is 16104 bytes

      10-15 17:04:36.909: E/dalvikvm(2767): Failed adding to JNI local ref table (has 512 entries)

解决问题:
1.我们通过阅读JNI的文档,对于FindClass 返回的一定需要调用DeleteLocalRef,还有jbyteArray 类型的变量需要DeleteLocalRef。
在我的代码中,这些都已经进行了处理,那么还有那些是Local Ref?
 
NewString/ NewStringUTF/NewObject/ GetObjectField生成的是不是?
 
通过测试发现,这些都是,Local Ref。
 
2.虽然把上面发现的都修改了,但还是出现ReferenceTable overflow (max=512)错误,通过代码阅读发现。有一处代码是这样写的。
 
SetObjectField(dwi, jfID, env->NewStringUTF(szDateTime))
问题就在env->NewStringUTF(szDateTime)地方,因为这种写法也是看Sun JNI的文档这样写的,因其在链表的循环中,在没有退出函数前,JNI的NewStringUTF产生的LocelRef不停的产生,从而导致ReferenceTable overflow (max=512)。
 
总结:
1.FindClass /NewString/ NewStringUTF/NewObject/ GetObjectField等产生的都是LocalRef,LocalRef有三种方式被VM 的GC清理。
2.不要学Sun JNI文档中类似下面的写法SetObjectField(dwi, jfID, env->NewStringUTF(szDateTime))。

JNI ReferenceTable overflow的更多相关文章

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

    这几天在搞基于位置的AR应用,採用了github上两款开源项目: mixare android-argument-reality-framework 这两个项目实现机制大致同样.我选取的是androi ...

  2. jni 修bug

     1. ReferenceTable overflow (max=512)  内存泄露,程序运行一段时间就挂掉了. 在利用反射调用java中的函数需要释放掉查找到的类 void publishJava ...

  3. cocos2dx获得字体的宽高

    Android: 1.在CCImage中添加下面的方法: //头文件声明略. cocos2d::CCSize CCImage::getStringSize(const char *text, cons ...

  4. 【转载】C# 中的委托和事件(详解)

    <div class="postbody"> <div id="cnblogs_post_body" class="blogpost ...

  5. android 内存泄露之jni local reference table overflow (max=512)

    在android项目中要实现一个需求 为了性能的要求只能用c代码来实现功能. 这样就牺牲了java跨平台性. 通过加载.so的方式,把用c实现的模块集成到app中. android提供jni层,作为一 ...

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

    原因是没即时释放对象,原本的代码是这样 static jobject getMaps(JNIEnv *env,jclass obj) { jclass stringbuilder_class = (* ...

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

    方法注册好后要经过哪些路 Android一个异常捕获项目 https://github.com/xroche/coffeecatch coffeecatch CoffeeCatch, a tiny n ...

  8. Android NDK之JNI陷阱

    背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台.这就涉及到Android NDK(native develop kit)内容.这里只想记录下JNI ...

  9. JNI总结(一)

    JNI 是 Java平台中的一个强大特性.应用程序能够通过 JNI把 C/C++代码集成进 Java程序中.通过 JNI.开发人员在利用 Java平台强大功能的同一时候,又不必放弃对原有代码的投资.由 ...

随机推荐

  1. iOS TTF文件使用---改变字体

    TTF(True Type Font):是一种字库名称 TTF文件:是Apple公司和Microsoft公司共同推出的字体文件格式 使用: 1 获取字体文件 从各种渠道下载字体ttf,网站或从别的ip ...

  2. Myeclipse使用DB Browser连接数据库错误:OPTION SQL_SELECT_LIMIT=DEFAULT

    虽然使用Myeclipse,经过test driver可以使用, 但是不能够查询mysql数据库各个表的数据.  百度了下, 原来是驱动mysql的插件版本很低,重新下了个, 可以了. 下面是链接. ...

  3. Android课程---优化ListView列表视图(2)

    layout_simple.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  4. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-3 底层驱动之LED_蜂鸣器

    视频简介: 该视频介绍iCore3应用开发平台出厂源代码中GPIO的配置方法 及如何点亮LED和驱动蜂鸣器发声. 源视频包下载地址: http://pan.baidu.com/s/1nvpYMff   ...

  5. 关于string.format() 转

    string.format()函数用来生成具有特定格式的字符串,这个函数有两个参数,第一个参数为格式化串:由指示符和控制格式的字符组成.第二个参数是对应格式中每个代号的各种数据. 格式字符串可能包含以 ...

  6. .net core 1.0 中的asp.net identity 基本使用(一)

    1.修改密码强度:打开Startup.cs,在public class Startup{}内找public void ConfigureServices(IServiceCollection serv ...

  7. 更换Mac记录

    1. 重装Mac (1)格式化硬盘 (2)重装系统 (3)修改各种配置:电脑名.键盘等 2. 安装必要软件 (1)QQ.微信.网易云音乐等 (2)火狐.谷歌.SourceTree等 (3)安装Git ...

  8. uploadfile图片上传和ashx

    uploadify.swf需要是支持中文   $(function () {   //获取所有上传按钮id   $("div[id^='fileInput_']").each(fu ...

  9. [dpdk] 熟悉SDK与初步使用 (四)(L3 Forwarding源码分析)

    接续前节:[dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析) 前文中的最后一个问题,搁置,并没有找到答案.所以继续阅读其他例子的代码,想必定能在其他位置看到答案. ...

  10. 在mvc中将session的值绑定在页面上

    第一步,在SqlServer数据库中创建存储过程,查询的是用户名(员工姓名)所扮演的角色: if exists(select * from sys.objects where name='proc_s ...