网站开发语言数据库有几种室内设计效果图马克笔
网站开发语言数据库有几种,室内设计效果图马克笔,intellij 网站开发,网站入口你明白我的意思吧Java 与JNI 内存管理是怎样的想要弄清楚Java与JNI的内存管理的关系#xff0c;首先要弄清楚JVM的内存模型JVM内存模型.png其中本地方法栈就是运行时调用native 方法的数据保存区。本地方法栈的大小可以设置成固定的或者是动态扩展。Java中的内存泄露JAVA 编程中的内存泄漏首先要弄清楚JVM的内存模型JVM内存模型.png其中本地方法栈就是运行时调用native 方法的数据保存区。本地方法栈的大小可以设置成固定的或者是动态扩展。Java中的内存泄露JAVA 编程中的内存泄漏从泄漏的内存位置角度可以分为两种JVM 中 Java Heap 的内存泄漏JVM 内存中 native memory 的内存泄漏。Java Heap 的内存泄漏Java 对象存储在 JVM 进程空间中的 Java Heap 中Java Heap 可以在 JVM 运行过程中动态变化。如果 Java 对象越来越多占据 Java Heap 的空间也越来越大JVM 会在运行时扩充 Java Heap 的容量。如果 Java Heap 容量扩充到上限并且在 GC 后仍然没有足够空间分配新的 Java 对象便会抛出 out of memory 异常导致 JVM 进程崩溃。Java Heap 中 out of memory 异常的出现有两种原因①程序过于庞大致使过多 Java 对象的同时存在②程序编写的错误导致 Java Heap 内存泄漏。多种原因可能导致 Java Heap 内存泄漏。JNI 编程错误也可能导致 Java Heap 的内存泄漏。JVM 中 native memory 的内存泄漏JVM 进程空间中Java Heap 以外的内存空间称为 JVM 的 native memory。进程的很多资源都是存储在 JVM 的 native memory 中例如载入的代码映像线程的堆栈线程的管理控制块JVM 的静态数据、全局数据等等。也包括 JNI 程序中 native code 分配到的资源。JNI编程中的内存泄露Native Code 本身的内存泄漏Global Reference 引入的内存泄漏JNI 编程中潜在的内存泄漏特别是LocalReference的使用哪些情况下需要做内存管理native code本身需要做内存管理如使用c/c语言编写需要遵守语言本身的内存管理策略如指针变量的创建于释放不当都可能产生内存泄露进一步导致内存JVM的崩溃。Global Reference的管理而 Global Reference 对 Java 对象的引用一直有效因此它们引用的 Java 对象会一直存在 Java Heap 中。在使用 Global Reference 时需要仔细维护对 Global Reference 的使用。如果一定要使用 Global Reference务必确保在不用的时候删除。就像在 C 语言中调用 malloc() 动态分配一块内存之后调用 free() 释放一样。否则Global Reference 引用的 Java 对象将永远停留在 Java Heap 中造成 Java Heap 的内存泄漏。Local Reference的管理Local Reference管理模型图localReference_Java_map.jpg从这个映射关系表可以看出实际上每当线程从 Java 环境切换到 native code 上下文时(J2N)JVM 会分配一块内存创建一个 Local Reference 表这个表用来存放本次 native method 执行中创建的所有的 Local Reference。每当在 native code 中引用到一个 Java 对象时JVM 就会在这个表中创建一个 Local Reference运行 native method 的线程的堆栈记录着 Local Reference 表的内存位置(指针 p)Local Reference 表中存放 JNI Local Reference实现 Local Reference 到 Java 对象的映射。native method 代码间接访问 Java 对象(java obj1java obj2)。通过指针 p 定位相应的 Local Reference 的位置然后通过相应的 Local Reference 映射到 Java 对象。当 native method 引用一个 Java 对象时会在 Local Reference 表中创建一个新 Local Reference。在 Local Reference 结构中写入内容实现 Local Reference 到 Java 对象的映射。native method 调用 DeleteLocalRef() 释放某个 JNI Local Reference 时首先通过指针 p 定位相应的 Local Reference 在 Local Ref 表中的位置然后从 Local Ref 表中删除该 Local Reference也就取消了对相应 Java 对象的引用(Ref count 减 1)。当越来越多的 Local Reference 被创建这些 Local Reference 会在 Local Ref 表中占据越来越多内存。当 Local Reference 太多以至于 Local Ref 表的空间被用光JVM 会抛出异常从而导致 JVM 的崩溃。Local Reference 不是native code的局部变量区别体现在局部变量存储在线程堆栈中而 Local Reference 存储在 Local Ref 表中。局部变量在函数退栈后被删除而 Local Reference 在调用 DeleteLocalRef() 后才会从 Local Ref 表中删除并且失效或者在整个 Native Method 执行结束后被删除。可以在代码中直接访问局部变量而 Local Reference 的内容无法在代码中直接访问必须通过 JNI function 间接访问。JNI function 实现了对 Local Reference 的间接访问JNI function 的内部实现依赖于具体 JVM。具体关于JNI内存泄露的实例分析可以参考IBM开发者社区的一篇文章在 JNI 编程中避免内存泄漏
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89746.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!