前言
上篇文章介绍了运行时数据区的 PC 寄存器、虚拟机栈,这篇讲的本地办法栈
一、本地办法
在解说运行时数据区里的本地办法栈时,先交叉一个内容解说本地办法库(红色框框)
什么是本地办法?
================================
简略地讲:一个 Native Method 就 是一个 Java 调用非 Java 代码的接口
。
该办法的实现由非 Java 语言实现,比方 C。
这个特色并非 Java 所特有,很多其它的编程语言都有这一 - 机制,比方在 C ++ 中,你能够用 extern “C” 告知 C ++ 编译器去调用一个 C 的函数。
在定义一一个 native method 时,并不提供实现体(有些像定义一个 Java interface),因为其实现体是由非 java 语言在里面实现的。
本地接口的作用是交融不同的编程语言为 Java 所用,它的初衷是 交融 C /C++ 程序
咱们能够查看 Object 类这个外面的 native 办法
public class Object {private static native void registerNatives();
static {registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
// 省略其余关键性代码....
}
为什么要应用 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 系统管理生产设施,在企业级利用中曾经比拟少见。
因为当初的异构畛域间的通信很发达,比方能够应用 Socket 通信,也能够应用 Web Service 等等
二、本地办法栈
通过后面的本地办法的理解,接下来咱们就能够回到运行时数据区里的本地办法栈了
Java 虚拟机栈用于治理 Java 办法的调用,而本地办法栈用于治理本地办法的调用
本地办法栈它是线程公有的
容许被实现成固定或者是可动静扩大的内存大小。(在内存湍出方面是雷同的)
- 如果线程申请调配的栈容量超过本地办法栈容许的最大容量,Java 虚拟机将会抛出一一个 stackOverflowError 异样。
- 如果本地办法栈能够动静扩大,并且在尝试扩大的时候无奈申请到足够的内存,或者在创立新的线程时没有足够的内存去创立对应的本地办法栈,那么 Java 虚拟机将会抛出一个 outofMemoryError 异样。
具体的做法就是:当咱们的线程须要应用到本地办法了就将它放入本地办法栈中注销,通过动静链接的形式让 Execution Engine 执行时调用相应的库
当 某个线程调用一个本地办法时,它就进入了一个全新的并且不再受虚拟机限度的世界
。
它和虚拟机领有同样的权限。
- 本地办法能够
通过本地办法接口来拜访虚拟机外部的运行时数据区
- 它甚至能够间接应用本地处理器中的寄存器
- 间接从本地内存的堆中调配任意数量的内存
并不是所有的 JVM 都反对本地办法,因为 Java 虚拟机标准并没有明确要求本地办法栈的应用语言、具体实现形式、数据结构等
。
如果 JVM 产品不打算反对 native 办法,也能够无需实现本地办法栈。
在 Hotspot JVM 中,间接将本地办法栈和虚拟机栈合二为一。
参考资料
尚硅谷:JVM 虚拟机(宋红康老师)