文档章节

Reference Table overflow (max=1024)异常处理

shzwork
 shzwork
发布于 06/26 09:58
字数 610
阅读 6
收藏 0

首先说一下出现这个问题的背景,通过Android的Camera采集视频信息然后通过JNI来调用C来软编码,但是发现有的手机再录制时间超过5分钟后就会出现异常崩溃!通过抓log发现是:“JNI pinned array reference table (0x5d4440a8) dump; ReferenceTable overflow (max=1024)”引起的奔溃!
  其中 ReferenceTable overflow (max=1024) 这句log是最关键的,它指出是由于引用计数器溢出造成的崩溃,看到这里后我排查了JNI代码,果然是JNI代码处理问题,因为我每次调用JNI方法时都会调用GetByteArrayElements来接受byte数组,但是却一直没有释放

uint8_t *inputBuffer = (uint8_t *) env->GetByteArrayElements(inputBuffer_, 0);

解决方案就是JNI方法中用完一行一定记得要释放,调用: env->ReleaseByteArrayElements(jbyteArray array, jbyte elems,
jint mode)
*

总结一下JNI中经常遇到的问题:

  1. 忘记释放引用或释放内存

凡是用到New的方法都需要手动进行释放(如:env->NewByteArray),调用: env->DeleteLocalRef方法进行释放,
还有调用GetByteArrayELement方法也要手动释放,调用:env->ReleaseTypeElements方法进行释放,如果只是取bytearray中的byte可以使用GetByteArrayRegion*方法来获取

2.发生Reference Table overflow (max=1024) 或 Reference Table overflow (max=512)之类的异常

如果发生类似的异常,就去排查JNI的代码,肯定有未释放的引用(global reference、local reference)

3.多线程的问题

第一种情况:在多线程使用JNIEnv对象,需要AttachCurrentThread将env挂到当前线程,否则无法使用env
  第二种情况:在多线程中调用java方法,需要保存jobject对象,这时需要对jobject对象做全局引用(
NewGlobalRef*),否则会失效

4.在JNI层获取jbytearray长度

不应该在JNI层获取jbytearray长度,应该在java层获取byte数组长度,然后再传给JNI层



作者:小木桨
链接:https://www.jianshu.com/p/4201e6dd8e4c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文转载自:https://www.jianshu.com/p/4201e6dd8e4c

shzwork
粉丝 11
博文 588
码字总数 10198
作品 0
厦门
私信 提问
IP_VFR-4-FRAG_TABLE_OVERFLOW【cisco设备报错】碎片攻击

问题描述: 05-23-2012 21:36:16 Local7.Warning 58.25x.x.x 52: *May 23 21:30:34: %IP_VFR-4-FRAG_TABLE_OVERFLOW:GigabitEthernet0/0: the fragment table hasreached its maximum thresh......

思懿
2016/07/27
0
0
记一次内核参数引起的服务崩溃

前言: 又被阿里云的ecs主机被坑了…. 一开始被那个所谓的安全组坑,后来又被 nc 端口空洞坑。。。。 这次是被阿里云默认的内核优化参数给干了…. 为啥要用阿里云主机,而不用实体服务器,主要...

rfyiamcool
2017/11/25
0
0
kernel: TCP: time wait bucket table overflow错误的解决办法

kernel: TCP: time wait bucket table overflow错误的解决办法 Dec 8 21:10:10 hz kernel: TCP: time wait bucket table overflow Dec 8 21:10:10 hz kernel: TCP: time wait bucket table o......

qazplm59
2018/06/26
0
0
SQL Server 日常维护经典应用

转载51GT2017-11-23 09:16评论(0)7人阅读 SQL Server日常维护常用的一些脚本整理。 1.sql server开启clr权限: exec sp_configure 'clr enabled', 1 GO RECONFIGURE GO ALTER DATABASE HWME......

yuanwx0328
2017/11/23
0
0
聊聊netty的maxDirectMemory

序 本文主要研究一下netty的maxDirectMemory() PlatformDependent netty-common-4.1.33.Final-sources.jar!/io/netty/util/internal/PlatformDependent.java netty的PlatformDependent有个静......

go4it
04/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GitOps 初探

前言 GitOps 的概念最初来源于 Weaveworks 的联合创始人 Alexis 在 2017 年 8 月发表的一篇博客 GitOps - Operations by Pull Request。文章介绍了 Weaveworks 的工程师如何以 Git 作为事实的...

阿里云云栖社区
18分钟前
0
0
keytool生成密钥

生成JKS Java KeyStore文件 我们首先使用命令行工具keytool生成密钥 - 更具体地说.jks文件: keytool -genkeypair -alias mytest -keyalg RSA ...

Canaan_
21分钟前
1
0
【从入门到放弃-Java】并发编程-NIO使用

前言 上文【从入门到放弃-SpringBoot】SpringBoot源码分析-请求过程中我们了解到,tomcat接收、返回请求的过程都是基于NIO实现的。日常工作中有很多基于NIO的使用,我们知道NIO可以提高系统的...

阿里云官方博客
22分钟前
2
0
mysql 如何删除数据库中所有的表

SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema = 'mydb'; mydb换成你想删除的数据库的名字......

RobertZhou
23分钟前
2
0
pytorch各种版本下载

链接地址:https://pytorch.org/get-started/previous-versions/

云烟成雨forever
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部