`
amazontzy
  • 浏览: 26435 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JNI内存泄露处理方法汇总

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

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

jobject jobj = env->NewObject(clazz,midInit);
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

例如,


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

env->DeleteLocalRef(ref);



2.NewString/ NewStringUTF/NewObject/NewByteArray

例如,


jstring     (*NewString)(JNIEnv*, const jchar*, jsize);   
const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);     void        (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
jstring     (*NewStringUTF)(JNIEnv*, const char*);   
const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);     void        (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);


env->DeleteLocalRef(ref);

3.GetObjectField/GetObjectClass/GetObjectArrayElement


jclass ref = env->GetObjectClass(robj);

env->DeleteLocalRef(ref); 


4.GetByteArrayElements和GetStringUTFChars


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

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

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

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


5.NewGlobalRef/DeleteGlobalRef

jobject     (*NewGlobalRef)(JNIEnv*, jobject);
void        (*DeleteGlobalRef)(JNIEnv*, jobject);
例如,

jobject ref= env->NewGlobalRef(customObj);
env->DeleteGlobalRef(customObj);

分享到:
评论

相关推荐

    jni层内存泄漏检测工具

    JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...

    基于Android Ndk/Jni的内存泄漏检测

    附件是Android下检测ndk和jni内存泄漏的demo,可以用于native中malloc和free的检测。使用方法(参见博客):https://blog.csdn.net/zhuyong006/article/details/88537499

    安卓中实现jni读取内存信息

    5. **处理返回的内存信息**:`getMemoryInfo()`方法会返回一个字符串,可以解析这个字符串来获取内存总量、可用内存等信息。注意,`/proc/meminfo`文件中的单位通常是KB,可能需要转换成MB或GB。 通过以上步骤,...

    08_15_JNI_03_方法访问_数组处理&jni引用

    08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_...

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

    JNI处理hashmap,string等对象的操作

    同时,你需要处理对象的引用,防止内存泄漏。 在`JNI处理hashmap.txt`中,你可能会找到关于如何遍历HashMap,添加、删除和查找元素的具体步骤。`JNI对象的操作.txt`可能会涵盖更多基本对象的创建和访问,而`JNI字符...

    jni调用java静态方法

    需要注意的是,由于JNI涉及到跨语言交互,因此在处理字符串、数组等复杂数据类型时,需要特别注意类型转换和内存管理。此外,由于每次Java类加载时都会执行静态初始化代码块,所以如果静态方法依赖于这些初始化,也...

    通过jni实现图像处理的demo

    至于支持汉字的传递和类的传递,这可能是指在JNI中处理包含汉字的字符串,以及将Java类的对象作为参数传递给本地方法。处理汉字需要确保编码正确,通常使用UTF-8编码。传递Java类的对象则需要使用JNI的NewGlobalRef...

    Android将camera获取到的YuvData在jni中转化为Mat方法

    Android将camera获取到的YuvData在jni中转化为Mat方法 一、 Android摄像头获取YuvData Android中可以通过camera获取图像,并实时处理,不同的手机camera支持的图像格式不同,可以采用getCameraPreviewFormat来...

    jni.zip jni编译jni下载

    在实际开发中,还需要注意一些细节,比如错误处理、内存管理(Java对象在本地代码中使用需要通过JNI函数创建和释放)、线程安全问题等。同时,由于涉及到跨语言和跨平台,理解JNI的工作原理和正确使用JNI头文件至关...

    用jni获得cpu和内存使用率

    在`sysinfo`这个压缩包文件中,很可能包含了一个名为`SysInfo`的Java类,这个类中定义了JNI接口,以及可能包含了一个C++源文件(如`SysInfo.cpp`),实现了获取CPU和内存使用率的本地方法。解压并查看这些文件,你...

    jni操作arraylist对象

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如调用本地库、优化性能...记得始终关注错误处理和内存管理,以避免潜在的问题。

    Android JNI图像处理经典例子

    JNI在处理特定任务时,如图像处理,能够提供比纯Java更高的性能。本示例着重介绍如何利用JNI和C语言进行图像处理,包括灰度化、二值化和边缘检测等操作。 首先,我们需要理解JNI的基本工作原理。JNI为Java应用程序...

    DELPHI开发JNI必备 jni.pas

    5. **内存管理**:JNI提供了在Java和本地代码之间管理内存的机制,如NewGlobalRef、DeleteLocalRef等,以避免内存泄漏。 6. **字符串和转换**:JNI提供了将Java字符串转换为本地字符串,以及反之的转换函数,方便...

    08_12_JNI_02_jni数据类型&属性方法

    08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08...

    android jni调用jni 方法

    本篇文章将深入探讨如何在Android中使用JNI以及如何在JNI层调用方法。 1. **JNI基本概念** - JNI是一种接口,让Java应用程序能够调用本地(非Java)代码,同时也允许本地代码调用Java方法。 - 在Android中,JNI...

    Android内存泄漏简介

    对于Android内存泄漏的检测和解决,开发者可以使用多种工具和方法。Android Studio中就集成有Profiler工具,可以帮助开发者监控应用程序的内存使用情况,并识别内存泄漏。此外,还有一些第三方的内存泄漏检测工具,...

    java内存泄漏问题追踪

    - 本地方法栈内存泄漏:Java Native Interface (JNI) 使用的本地方法可能会占用C/C++堆内存,如未释放,可能导致内存泄漏。 2. 内存泄漏的检测: - Java VisualVM:这是JDK自带的工具,可以进行内存快照分析,...

Global site tag (gtag.js) - Google Analytics