频繁点击一个按钮,程序崩溃,查看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来进行释放。

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

转载于:https://blog.51cto.com/sunnyzlh/1763549

jni ReferenceTable overflow相关推荐

  1. Android JNI调用OpenCV,长时间运行内存异常,导致闪退的log分析和解决---(ReferenceTable overflow (max=1024)造成的)

    首先交代下问题背景,前些日子自己在android上搞了个入侵检测玩.就是camera当作监控设备,每隔一定时间检测是否有东西入侵,如果入侵率到一定程度就报警的东西.最近发现,每次运行超过20分钟,ap ...

  2. local reference table overflow 内存泄露

    local reference table overflow JNI层coding经常会遇到ReferenceTable overflow问题,特别是当jni函数被反复调用上千上万次的时候,现汇总如下 ...

  3. jni调用java数组导致VM aborting,安卓程序莫名闪退

    如果你的程序使用了如下的场景: jint JNICALL Java_Test_WriteRCArray( JNIEnv *env, jobject obj, jintArray buf) {  jin ...

  4. 我爱机器学习网机器学习类别文章汇总

    机器学习领域的几种主要学习方式 From Stumps to Trees to Forests KDD-2014 – The Biggest, Best, and Booming Data Scien ...

  5. 我爱机器学习--机器学习方向资料汇总

    转载:http://blog.csdn.net/shuimanting520/article/details/45748505 机器学习爱好者资料 机器学习领域的几种主要学习方式 From Stump ...

  6. Swig/CPP2Java

    简介 实际工程可能存在如下部分:业务接口需要编程高效的语言(如Python.Java等),易于部署维护:而核心算法部分,某些场景需要高效计算,会使用性能高效的语言(如C/C++等). 对于上述场景,& ...

  7. 无法加载JNI共享库(JDK)

    当我尝试打开Eclipse时 ,弹出对话框指出: 无法加载JNI共享库" C:/JDK/bin/client/jvm.dll". 此后,Eclipse强制关闭. 我想提出几点: 我 ...

  8. I.MX6 GPS JNI HAL register init hacking

    /************************************************************************************ * I.MX6 GPS JN ...

  9. JNI实现源码分析【三 间接引用表】

    在JNI实现源码分析[二 数据结构]的参数传递一节中,我们提到,JNI为了安全性的考虑使用了形如jobject的结构来传递参数.而jobject被表述为指针,但又不是直接指向Object的指针那么jo ...

最新文章

  1. VML编程之------VML语言入门《VML极道教程》原著:沐缘华
  2. ClickHouse数据分析列式数据库概述
  3. 布尔运算_利用布尔运算拆分汉字
  4. 江湖救急!磁盘数据大救星TestDisk
  5. 洛谷——P1307 [NOIP2011 普及组] 数字反转
  6. python读取文本数据--完善中
  7. UML在线画图工具ProcessOn
  8. Android MD5加密
  9. 智能合约漏洞,公链的阿喀琉斯之踵
  10. Mac电脑无法从Photoshop 2020作为插件访问DeNoise AI的解决办法
  11. NIVIDIA 硬解码学习4
  12. 微信小程序分享朋友圈 详细教程及注意事项
  13. 易捷行云超大规模云计算中心巡检“零干预”
  14. color constancy dataset(白平衡仿真数据集)
  15. cout和cerr的区别
  16. 20套各种风格影视动画公司响应式企业模电影上映影讯网站模板电影软件网页CSS模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响应
  17. CNN卷积层神经元数量、连接数量、权重数量的计算
  18. python 20秒画完小猪佩奇“社会人”
  19. CAD中如何给文本自动编号呢?
  20. matlab阵列天线波束扫描,Matlab在相控阵天线中的应用.pdf

热门文章

  1. php 进程管理及操作
  2. Poj 1755Triathlon 未Ac,先mark
  3. 机器视觉——单目相机模型(坐标标定以及去畸变)
  4. 【OpenCV】简单高效地访问图像像素
  5. 天龙源码框架分析_天龙源码分析 - 客户端登录流程
  6. android 初始化变量,变量初始化 - Android Studio
  7. 计算机应用基础对其他课程的帮助,对计算机应用基础课程的探讨(4页)-原创力文档...
  8. 普通类创建获取session 方式_Springboot系列之RestApi中获取枚举类属性的几种方式...
  9. 注册规划师 计算机科学与技术,关于公布2018年度注册城乡规划师考试合格人员名单的通知...
  10. java聚合_Java™ 教程(聚合归纳操作)