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,"<init>","()V"); jobject stringbuilder_obj=(*env)->NewObject(env,stringbuilder_class,init_stringbuilder_Method); jmethodID append_Method = (*env)->GetMethodID(env,stringbuilder_class,"append","(Ljava/lang/Object;)Ljava/lang/StringBuilder;"); FILE * fileP;
char item[200]="ii"; fileP = fopen( "/proc/self/maps","r"); if(!fileP)
return stringbuilder_obj;
while(fgets(item,sizeof(item),fileP)!=NULL)
{ jstring str = (*env)->NewStringUTF(env,item); (*env)->CallObjectMethod(env,stringbuilder_obj,append_Method,str); (*env)->ReleaseStringUTFChars(env,str,item);
(*env)->DeleteLocalRef(env,str); }
return stringbuilder_obj; }
直接看去好像没什么问题,但是每调用一次 (*env)->CallObjectMethod(env,stringbuilder_obj,append_Method,str)
;都会产生个对象,我一开始以为这样没事,改成这样程序就不崩了
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,"<init>","()V"); jobject stringbuilder_obj=(*env)->NewObject(env,stringbuilder_class,init_stringbuilder_Method); jmethodID append_Method = (*env)->GetMethodID(env,stringbuilder_class,"append","(Ljava/lang/Object;)Ljava/lang/StringBuilder;"); FILE * fileP;
char item[200]="ii"; fileP = fopen( "/proc/self/maps","r"); if(!fileP)
return stringbuilder_obj;
while(fgets(item,sizeof(item),fileP)!=NULL)
{ jstring str = (*env)->NewStringUTF(env,item);
//加个temp用来释放
jobject temp=(*env)->CallObjectMethod(env,stringbuilder_obj,append_Method,str); (*env)->ReleaseStringUTFChars(env,str,item);
(*env)->DeleteLocalRef(env,str);
(*env)->DeleteLocalRef(env,temp);
}
return stringbuilder_obj; }
JNI内存泄露JNI ERROR (app bug): local reference table overflow (max=512)的更多相关文章
- android 内存泄露之jni local reference table overflow (max=512)
在android项目中要实现一个需求 为了性能的要求只能用c代码来实现功能. 这样就牺牲了java跨平台性. 通过加载.so的方式,把用c实现的模块集成到app中. android提供jni层,作为一 ...
- JNI手动释放内存(避免内存泄露)
. 哪些需要手动释放? 不要手动释放(基本类型): jint , jlong , jchar 需要手动释放(引用类型,数组家族): jstring,jobject ,jobjectArray,jint ...
- JNI Local Reference Changes in ICS
[This post is by Elliott Hughes, a Software Engineer on the Dalvik team. — Tim Bray] If you don’t wr ...
- JNI错误记录--JNI程序调用本地库时JVM崩溃
什么是JNI内存泄露,基本的避免方法 : http://www.ibm.com/developerworks/cn/java/j-lo-jnileak/ 最近的课题中需要用到Spark,同组同学负责的 ...
- JavaScript 中 4 种常见的内存泄露陷阱
了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...
- JavaScript 中常见的内存泄露陷阱(摘)
内存泄露是每个开发者最终都不得不面对的问题.即便使用自动内存管理的语言,你还是会碰到一些内存泄漏的情况.内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与其他应用相关的问题. 什么是内 ...
- 查找并修复Android中的内存泄露—OutOfMemoryError
[编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 One ...
- 堆和栈的内存分布&一些关于内存泄露、栈溢出和野指针的内容(头秃
内存泄漏&栈溢出 C++中,我们主要涉及的内存是栈和堆, 堆 (By programmer) 申请后由程序员主动释放,遗忘后果严重: 栈 (By compiler)需要时由编译器分配,在不需 ...
- [Android] JNI中的Local Reference
参考文章:<在 JNI 编程中避免内存泄漏> 一.Local Reference 深层解析 JNI Local Reference 的生命期是在 native method 的执行期(从 ...
随机推荐
- RSA 格式 - 转载
转载自 RSA(三) 密钥的格式 https://www.shangyang.me/2017/05/24/encrypt-rsa-keyformat/#%E5%89%8D%E8%A8%80 PEM 和 ...
- shiro验证(转)
http://blog.csdn.net/tch918/article/details/13765799
- Appium环境搭建——安卓真机调试注意点
1.安卓设备连接失败 通过adb devices命令 查看安卓设备的连接情况,如图,未成功连接 解决方法: (1)关闭360安全卫士和360手机助手(2)查看5037端口是否被占用 netstat - ...
- Python练习八
1.获取移动平均值. def generator(): sum = 0 num = 0 count = 0 avg = 0 while 1: num = yield avg sum += num co ...
- PY序
Python实现机器学习依赖于两个类库——SciPy和scikit-learn 一)SciPy SciPy是数学运算的基本类库,在机器学习的过程中,主要运用NumPy.Matplotlib和Panda ...
- MySQL出现too many connections(1040)错误解决方法
https://www.cnblogs.com/2881064178dinfeng/p/6938112.html 其实MySQL默认的最大连接数为100,可能在大访问量的时候造成了连接不上数据库.解决 ...
- [R] [Johns Hopkins] R Programming -- week 4
#Generating normal distribution (Pseudo) random number x<-rnorm(10) x x2<-rnorm(10,2,1) x2 set ...
- Django之 HelloWorld
1.C:\Users\andy>django-admin startproject sundyblog ## 创建项目 C:\Users\andy>cd sundyblog2. ...
- log4j根据包名 日志输出到不同文件中 , service层无法输出日志问题
1. service 层因为要配置事务,使用了代理 <aop:config proxy-target-calss=''true"> <aop:pointcut id=&qu ...
- element-ui 点击获取table的行索引
<el-table :data="list" v-loading.body="listLoading" element-loading-text=&quo ...