概念
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务,即非java方法一般是使用C语言进行实现。
并且jvm规范中对本地方法栈中方法使用的语言、方式、数据结构并没有任何强制规定,所以具体虚拟机可以根据需求自由的去实现它。甚至 Hot-Spot 虚拟机直接把本地方法栈和虚拟机栈合二为一。
作用
java虚拟机调用本地方法时,需要给这个本地方法提供的内存空间。
本地方法翻译过来 Native Method ,在这里是指不是由java代码编写的方法,因为java代码有一定的限制,java有时候不能和操作系统底层交互,所以就需要使用C或者C++ 等一些别的语言和操作系统进行交互,然后由java代码调用这些封装好的本地方法接口间接和操作系统进行交互。
java代码使用情况
最典型的使用地方就是所有的父类 Object
object中clone方法声明就是 native,会发现在java源码中所有的native方法是没有方法实现的,它所有的实现都是由其它语言进行编写的比如C语言,java通过clone方法接口去进行调用C和 C++ 的方法实现。
这样的方法在java源码中很多,比如 object 中 hashCode 方法,notify 方法等。
特点
会存在溢出的情况
1. 如果线程请求的栈深度大于虚拟机允许的最大深度时,将会抛出StackOverflowError异常
2. 如果虚拟机的栈内存允许动态扩展,当扩展栈容量无法申请到足够的内存时,将抛出 OutOfMemoryError异常。
线程私有的
为了保证线程中的局部变量不被别的线程访问到,所以虚拟机栈和本地方法栈是线程私有的。
扩展
jvm规范中允许java虚拟机实现自行选择是否支持栈的扩展,而Hot-spot虚拟机不支持扩展,所以除非在创建线程申请内存时就因无法获得足够内存而出现 OutOfMemoryError异常,否则在线程运行时是不会因为扩展而导致内存溢出的,只会因为栈容量无法 容纳新的栈帧而导致StackOverflowError异常。