JNI Reference
来源:互联网 发布:python cmdb源码 编辑:程序博客网 时间:2024/05/22 15:36
Referencing Java Objects
Primitive types, such as integers, characters, and so on, are copied between Java and native code. Arbitrary Java objects, on the other hand, are passed by reference. The VM must keep track of all objects that have been passed to the native code, so that these objects are not freed by the garbage collector. The native code, in turn, must have a way to inform the VM that it no longer needs the objects. In addition, the garbage collector must be able to move an object referred to by the native code.
Global and Local References
The JNI divides object references used by the native code into two categories: local and global references. Local references are valid for the duration of a native method call, and are automatically freed after the native method returns. Global references remain valid until they are explicitly freed.
Objects are passed to native methods as local references. All Java objects returned by JNI functions are local references. The JNI allows the programmer to create global references from local references. JNI functions that expect Java objects accept both global and local references. A native method may return a local or global reference to the VM as its result.
In most cases, the programmer should rely on the VM to free all local references after the native method returns. However, there are times when the programmer should explicitly free a local reference. Consider, for example, the following situations:(这个不是特别理解)
- A native method accesses a large Java object, thereby creating a local reference to the Java object. The native method then performs additional computation before returning to the caller. The local reference to the large Java object will prevent the object from being garbage collected, even if the object is no longer used in the remainder of the computation.
- A native method creates a large number of local references, although not all of them are used at the same time. Since the VM needs a certain amount of space to keep track of a local reference, creating too many local references may cause the system to run out of memory. For example, a native method loops through a large array of objects, retrieves the elements as local references, and operates on one element at each iteration. After each iteration, the programmer no longer needs the local reference to the array element.
The JNI allows the programmer to manually delete local references at any point within a native method. To ensure that programmers can manually free local references, JNI functions are not allowed to create extra local references, except for references they return as the result.
Local references are only valid in the thread in which they are created. The native code must not pass local references from one thread to another.
Implementing Local References
To implement local references, the Java VM creates a registry for each transition of control from Java to a native method. A registry maps nonmovable local references to Java objects, and keeps the objects from being garbage collected. All Java objects passed to the native method (including those that are returned as the results of JNI function calls) are automatically added to the registry. The registry is deleted after the native method returns, allowing all of its entries to be garbage collected.
There are different ways to implement a registry, such as using a table, a linked list, or a hash table. Although reference counting may be used to avoid duplicated entries in the registry, a JNI implementation is not obliged to detect and collapse duplicate entries.
Note that local references cannot be faithfully implemented by conservatively scanning the native stack. The native code may store local references into global or heap data structures.
来源:
https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#referencing_java_objects
- JNI Reference
- Reference Materials about JNI
- JNI Quick Reference
- Android:JNI Local Reference Changes in ICS
- Android:JNI Local Reference Changes in ICS
- JNI Local Reference Changes in ICS
- JNI 的 local reference table overflowed 问题
- JNI Local Reference Changes in ICS
- JNI Local Reference Changes in ICS
- JNI--JNI ERROR (app bug): accessed stale local reference
- JNI官方规范中文版——如何使用JNI中的global reference和local reference
- JNI官方规范中文版——如何使用JNI中的global reference和local reference
- JNI官方规范中文版——如何使用JNI中的global reference和local reference
- JNI官方规范中文版——如何使用JNI中的global reference和local reference
- JNI官方规范中文版——如何使用JNI中的global reference和local reference
- JNI官方规范中文版——如何使用JNI中的global reference和local reference
- JNI官方规范中文版——如何使用JNI中的global reference和local reference
- JNI ERROR (app bug): accessed stale local reference
- curl安装和学习笔记
- android 在代码中获取SHA1值
- ajax从入门到深入精通
- Java中的数组排序
- bootstrap-meta,@madie
- JNI Reference
- jmeter浅谈性能测试指标分析
- HDU-1011 Starship Troopers (树上背包)
- Selenium 错误 Element is not clickable at point (x, y). Other element would receive the click
- CMG.Suite.v2015.101-ISO 1DVD
- SAP B1 License Server Mirror
- in_array函数的效率测试和二分法初测
- linux系统异常,学习如何通过系统日志进行初步排查
- 先知先觉