本地方法栈(Native Method Stacks)

概述

​ 本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

​ 《Java虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何强制规定,因此具体的虚拟机可以根据需要自由实现它,甚至有的Java虚拟机(譬如HotSport虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError异常。

总结

​ Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。

​ 本地方法栈也是线程私有的。

​ 允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的):

  • 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError异常
  • 如果本地方法栈可以动态地扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对用的本地方法栈,那么Java虚拟机将会抛出一个OutOfMemoryError异常。

它具体的做法是Native Method Stack中登记native方法,在Execution Engine执行时加载本地方法库。

当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限。

  • 本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区。
  • 它甚至可以直接使用本地处理器中的寄存器
  • 直接从本地内存的堆中分配任意数量的内存

在HotSpot JVM中,直接将本地方法栈和虚拟机栈合二为一。

Donate comment here