文档章节

JNI内存泄露处理方法汇总

shzwork
 shzwork
发布于 06/26 18:20
字数 376
阅读 5
收藏 0

 

在c++中new的对象,如果不返回java,必须用release掉,否则内存泄露。包括NewStringUTF,NewObject。如果返回java不必release,java会自己回收。

 

 
  1. jstring jstr = env->NewStringUTF((*p).sess_id);

  2. ...

  3. env->DeleteLocalRef( jstr);

  4.  
  5. jobject jobj = env->NewObject(clazz,midInit);

  6. return jobj;


内存泄露可以先从windows资源管理器中,看到随程序运行,内存不断增长的趋势,具体可以用hp jmeter检测。在运行程序时,加jvm参数 -Xrunhprof:heap=all,cutoff=0 ,生成java.hprof.txt,用jmeter打开,Metric -> Residual Objects (Count),可以看到未回收的对象,选中要查看的对象,点Mark记录下要查看的对象,Window -> New Window 打开新窗口,用Metric -> Reference Graph Tree,然后点Find Immediately可以看到对象被哪里引用。

总体原则:释放所有对object的引用

1.FindClass 

 
  1. jclass ref= (env)->FindClass("java/lang/String");

  2.  
  3. env->DeleteLocalRef(ref);


2.NewString / NewStringUTF / NewObject / NewByteArray

例如,

 
  1. jstring (*NewString)(JNIEnv*, const jchar*, jsize);

  2.  
  3. const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);

  4. void (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);

  5.  
  6. jstring (*NewStringUTF)(JNIEnv*, const char*);

  7.  
  8. const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);

  9. void (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);


env->DeleteLocalRef(ref); 

3.GetObjectField/GetObjectClass/GetObjectArrayElement
 

 
  1. jclass ref = env->GetObjectClass(robj);

  2.  
  3. env->DeleteLocalRef(ref);

 
4.GetByteArrayElements和GetStringUTFChars

 
  1. jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy);

  2. (*env)->ReleaseByteArrayElements(env,jarray,array,0);

  3.  
  4. const char* input =(*env)->GetStringUTFChars(env,jinput, &isCopy);

  5. (*env)->ReleaseStringUTFChars(env,jinput,input);


5.NewGlobalRef/DeleteGlobalRef
 

 
  1. jobject (*NewGlobalRef)(JNIEnv*, jobject);

  2. void (*DeleteGlobalRef)(JNIEnv*, jobject);


例如,
 

 
  1. jobject ref= env->NewGlobalRef(customObj);

  2. env->DeleteGlobalRef(customObj);

本文转载自:https://blog.csdn.net/wangpingfang/article/details/53945479

shzwork
粉丝 11
博文 596
码字总数 10198
作品 0
厦门
私信 提问
在 JNI 编程中避免内存泄漏

此文转自 IBM developerWorks JNI 编程简介 JNI,Java Native Interface,是 native code 的编程接口。JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native code;在...

IBMdW
2011/04/26
968
1
理解Android Bitmap

基于android-6.0.1_r80源代码分析 通过下面三个章节基本可以扫清盲区。文章没有覆盖到的一方面是Bitmap用法,这部分建议阅读库源代码。一些的概念,例如,需要具备一定CG物理基础,不管怎样先...

Cc养鱼人
2017/11/27
0
0
Android:内存控制及OOM处理

OOM(内存溢出)和Memory Leak(内存泄露)有什么关系? OOM可能是因为Memory Leak,也可能是你的应用本身就比较耗内存(比如图片浏览型的)。所以,出现OOM不一定是Memory Leak。 同样,Mem...

Xushao
2013/05/07
0
1
Android中的内存泄漏和内存溢出.md

概念 内存泄漏是因为持有对象长期引用,导致对象无法被 GC 回收。 为了避免这种情况,我们可以选择在对象生命周期结束的时候,解除绑定,将引用置为空,或者使用弱引用。 例子 单例模式导致内...

hongjay
2018/05/09
0
0
Android内存泄漏与内存溢出,怎么检测与防止

1.基本概念 内存溢出(out of memory)是指程序在申请内存时,没有足够的内存空间供其使用,出现OOM,比如一个Android 进程可以供使用的内存只有1.1M,但是 处理一个Bitmap申请了1.2M,就会OOM...

iSnowFlake
2016/01/06
28
0

没有更多内容

加载失败,请刷新页面

加载更多

数据科学热潮下的冷思考:什么才是最需要的技能?

全文共3087字,预计学习时长6分钟 图片来源:pexels.com/@freestocks 数据科学已经进入了稳定生产的成熟期,数据科学家所需的技能也在与时俱进。不仅是追求更高效的机器学习模型,在当下,推...

读芯术
30分钟前
3
0
48.Nginx访问日志 日志切割 静态文件不记录

12.10 Nginx访问日志 12.11 Nginx日志切割 12.12 静态文件不记录日志和过期时间 12.10 Nginx访问日志: ~1.日志格式 vim /usr/local/nginx/conf/nginx.conf //搜索log_format log_format com...

oschina130111
35分钟前
3
0
好程序员分享Css详解bem书写规范

  好程序员分享Css详解bem书写规范,bem是基于组件的web开发方法。其思想是将用户界面分隔为独立的块,从而使开发复杂的UI界面变得更简单和快,且不需要粘贴复制便可复用现有代码。BEM由B...

好程序员IT
39分钟前
3
0
基于cm+cdh搭建大数据集群

第一部分:搭建基本环境 1、网络配置 vim /etc/sysconfig/network-scripts/ifcfg-ens32 service network restart vim /etc/hosts 192.168.15.121 node1 192.168.15.122 node2 192.168.15.123......

一个点一个点
47分钟前
0
0
[学]ngin反向代理搭建与配置

Nginx安装地址:https://www.cnblogs.com/wyd168/p/6636529.html (linux) 必须安装的4个包: nginx-1.1.10.tar.gz openssl-1.0.1t.tar.gz pcre-8.39.tar.gz zlib-1.2.11.tar.gz ng配置主要......

覃光林
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部