Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域,分别是:程序计数器(PC)、Java虚拟机栈(VMS)、本地方法栈(NMS)、Java堆(Heap)、方法区(MA)。其中方法区中有一个比较重要的区域叫做运行时常量池。其中程序计数器、虚拟机栈和本地方法栈都是线程独有的,而堆和方法区是线程之间共有的。
1.本地方法栈
本地方法栈与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务,保存的是本地方法要执行所需的必要参数。Native方法一般是用其它语言(C、C++ 或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序,对待这些方法需要特别处理。Native方法执行是在os中执行的,并非在JVM中执行的,所以使用的是os的程序计数器而非JVM的程序计数器。本地方法栈只是存储了线程要运行这个方法的必要信息,比如出口,入口,动态链接,局部变量表,操作数栈等。
Native方法是 Java 通过 JNI 直接调用本地 C/C++ 库,可以认为是 Native 方法相当于 C/C++ 暴露给 Java 的一个接口,Java 通过调用这个接口从而调用到 C/C++ 方法。当线程调用 Java 方法时,虚拟机会创建一个栈帧并压入 Java 虚拟机栈。然而当它调用的是 native 方法时,虚拟机会保持 Java 虚拟机栈不变,也不会向 Java 虚拟机栈中压入新的栈帧,虚拟机只是简单地动态连接并直接调用指定的 native 方法。