原因是没即时释放对象,原本的代码是这样

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)的更多相关文章

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

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

  2. JNI手动释放内存(避免内存泄露)

    . 哪些需要手动释放? 不要手动释放(基本类型): jint , jlong , jchar 需要手动释放(引用类型,数组家族): jstring,jobject ,jobjectArray,jint ...

  3. 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 ...

  4. JNI错误记录--JNI程序调用本地库时JVM崩溃

    什么是JNI内存泄露,基本的避免方法 : http://www.ibm.com/developerworks/cn/java/j-lo-jnileak/ 最近的课题中需要用到Spark,同组同学负责的 ...

  5. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  6. JavaScript 中常见的内存泄露陷阱(摘)

    内存泄露是每个开发者最终都不得不面对的问题.即便使用自动内存管理的语言,你还是会碰到一些内存泄漏的情况.内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与其他应用相关的问题. 什么是内 ...

  7. 查找并修复Android中的内存泄露—OutOfMemoryError

    [编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 One ...

  8. 堆和栈的内存分布&一些关于内存泄露、栈溢出和野指针的内容(头秃

    内存泄漏&栈溢出 C++中,我们主要涉及的内存是栈和堆, 堆  (By programmer) 申请后由程序员主动释放,遗忘后果严重: 栈 (By compiler)需要时由编译器分配,在不需 ...

  9. [Android] JNI中的Local Reference

    参考文章:<在 JNI 编程中避免内存泄漏> 一.Local Reference 深层解析 JNI Local Reference 的生命期是在 native method 的执行期(从 ...

随机推荐

  1. DW/BI领域的自动化调度方案

    1,利用专用自动化工具:如Tidal,Ctrl-M,Jenkins等.特点是功能强大,可以调用各种平台程序,脚本,可以设置依赖关系,调度时间,可以监控运行状态,发送邮件. 2,利用工具自身携带的调度功 ...

  2. Linux系统环境下Tomcat8、httpd、mysql8开机自启动配置

    Linux系统环境下Tomcat8.httpd.mysql8开机自启动配置: 相关命令:chkconfig 参考链接:https://jingyan.baidu.com/article/6525d4b ...

  3. python多进程拷贝数据

    from multiprocessing import Pool,Manager import os #完成拷贝文件 def copyFile(filename,oldname,newname,que ...

  4. SpringBoot 部署到linux环境

    第一部分:Springboot项目部署 说明:工具使用的是IEDA 第一:项目打包 1.在pom文件中添加插件 <build> <plugins> <plugin> ...

  5. ctrl+c以及写操作失败和flush

    .kill命令可以带信号号码选项,也可以不带.如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源.也可以用kill向进程发送特定的信号 ...

  6. deemo

    第一部分:结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 因为亲戚的推荐,就业前景好.个人条件的话,算一般.与其他博主相比还是有些差距的. 第二部分:在计算机系里学习 你对你 ...

  7. EBS WEBADI导入日记账 客户化账户组合规则校验

    近期项目需求对EBS中WEBADI导入日记账时,在加载数据时需要对账户组合额外进行客户化的校验,需要能够做到将校验结果体现在WEBADI模板的数据上,并且对每条错误数据都单独报错. 项目上的方案是调整 ...

  8. Visual Studio 2017 Android 调试无法连接到虚拟机

    输出窗口输出如下: 1>Starting deploy 4.5" KitKat (4.4) HDPI Phone ... 1>Starting emulator 4.5" ...

  9. js求两个数组的交集|并集|差集|去重

    let a = [1,2,3], b= [2, 4, 5]; 1.差集 (a-b 差集:属于a但不属于b的集合)  a-b = [1,3] (b-a 差集:属于b但不属于a的集合)  b-a = [4 ...

  10. chromedriver与chrome各版本的对应关系表

    driver的下载地址 http://chromedriver.storage.googleapis.com/index.html 对应关系也可以查看 google官方的说明,通过当前浏览器版本找到对 ...