AndroidAndroid技术知识Android开发

Android开发之JNI内存模型

2017-03-23  本文已影响616人  csong
JVM内存模型.png

其中本地方法栈就是运行时调用native 方法的数据保存区。

本地方法栈的大小可以设置成固定的或者是动态扩展。

JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏;JVM 内存中 native memory 的内存泄漏。

从这个映射关系表可以看出,实际上,每当线程从 Java 环境切换到 native code 上下文时(J2N),JVM 会分配一块内存,创建一个 Local Reference 表,这个表用来存放本次 native method 执行中创建的所有的 Local Reference。每当在 native code 中引用到一个 Java 对象时,JVM 就会在这个表中创建一个 Local Reference:

Local Reference 不是native code的局部变量,区别体现在:

  1. 局部变量存储在线程堆栈中,而 Local Reference 存储在 Local Ref 表中。

  2. 局部变量在函数退栈后被删除,而 Local Reference 在调用 DeleteLocalRef() 后才会从 Local Ref 表中删除,并且失效,或者在整个 Native Method 执行结束后被删除。

  3. 可以在代码中直接访问局部变量,而 Local Reference 的内容无法在代码中直接访问,必须通过 JNI function 间接访问。JNI function 实现了对 Local Reference 的间接访问,JNI function 的内部实现依赖于具体 JVM。

具体关于JNI内存泄露的实例分析可以参考IBM开发者社区的一篇文章:在 JNI 编程中避免内存泄漏

上一篇下一篇

猜你喜欢

热点阅读