共计 1692 个字符,预计需要花费 5 分钟才能阅读完成。
上文咱们聊到 JVM 的虚拟机栈,明天咱们接着分享 JVM 的本地办法栈。
什么是本地办法接口?
简略地讲,一个 Native Method 就是一个 Java 调用非 Java 代码的接口。一个 Native Method 是这样一个 Java 办法:该办法的实现由非 Java 语言实现,比方 C。这个特色并非 Java 所特有,很多其它的编程语言都有这一机制,比方在 C ++ 中,你能够用 extern “C” 告知 C ++ 编译器去调用一个 C 的函数。
“A native method is a Java method whose implementation is provided by non-java code.”
在定义一个 native method 时,并不提供实现体(有些像定义一个 Java interface),因为其实现体是由非 java 语言在里面实现的。
本地接口的作用是交融不同的编程语言为 Java 所用,它的初衷是交融 C/C++ 程序。
# 为什么要应用 Native Method?
Java 应用起来十分不便,然而有些档次的工作用 Java 实现起来不容易,或者咱们对程序的效率很在意时,问题就来了。
与 Java 环境外交互:
- 有时 Java 利用须要与 Java 里面的环境交互,这是本地办法存在的次要起因。你能够想想 Java 须要与一些底层零碎,如操作系统或某些硬件替换信息时的状况。本地办法正是这样一种交换机制:它为咱们提供了一个十分简洁的接口,而且咱们无需去理解 Java 利用之外的繁琐的细节。
与操作系统交互:
- JVM 反对着 Java 语言自身和运行时库,它是 Java 程序赖以生存的平台,它由一个解释器(解释字节码)和一些连贯到本地代码的库组成。然而不管怎样,它毕竟不是一个残缺的零碎,它常常依赖于一些底层零碎的反对。这些底层零碎经常是弱小的操作系统。通过应用本地办法,咱们得以用 Java 实现了 jre 的与底层零碎的交互,甚至 JVM 的一些局部就是用 C 写的。还有,如果咱们要应用一些 Java 语言自身没有提供封装的操作系统的个性时,咱们也须要应用本地办法。
Sun’s Java
- Sun 的解释器是用 C 实现的,这使得它能像一些一般的 C 一样与内部交互。jre 大部分是用 Java 实现的,它也通过一些本地办法与外界交互。例如:类 java.lang.Thread 的 setPriority()办法是用 Java 实现的,然而它实现调用的是该类里的本地办法 setPriority0()。这个本地办法是用 C 实现的,并被植入 JVM 外部,在 Windows 95 的平台上,这个本地办法最终将调用 Win32 SetPriority() API。这是一个本地办法的具体实现由 JVM 间接提供,更多的状况是本地办法由内部的动态链接库(external dynamic link library)提供,而后被 JVM 调用。
本地办法栈
- Java 虚拟机栈用于治理 Java 办法的调用,而本地办法栈用于治理本地办法的调用。
- 本地办法栈,也是线程公有的。
容许被实现成固定或者是可动静扩大的内存大小。(在内存溢出方面是雷同的)
- 如果线程申请调配的栈容量超过本地办法栈容许的最大容量,Java 虚拟机将会抛出一个 StackOverflowError 异样。
- 如果本地办法栈能够动静扩大,并且在尝试扩大的时候无奈申请到足够的内存,或者在创立新的线程时没有足够的内存去创立对应的本地办法栈,那么 Java 虚拟机将会抛出一个 OutOfMemoryError 异样。
- 本地办法是应用 C 语言实现的。
- 它的具体做法是 Native Method Stack 中注销 native 办法,在 Execution Engine 执行时加载本地办法库。
当某个线程调用一个本地办法时,它就进入了一个全新的并且不再受虚拟机限度的世界。它和虚拟机领有同样的权限。
- 本地办法能够通过本地办法接口来 拜访虚拟机外部的运行时数据区。
- 它甚至能够间接应用本地处理器中的寄存器
- 间接从本地内存的堆中调配任意数量的内存。
并不是所有的 JVM 都反对本地办法。因为 Java 虚拟机标准并没有明确要求本地办法栈的应用语言、具体实现形式、数据结构等。如果 JVM 产品不打算反对 native 办法,也能够无需实现本地办法栈。
跪求三连
码字不易,还请点个赞和珍藏~
正文完