JVM本地方法栈/虚拟机栈

本地方法栈

JVM的本地方法栈-通俗理解
1.本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,

2.其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

3.虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。

4.与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

一个线程可能在整个生命周期中都执行Java方法,操作它的Java栈;或者它可能毫无障碍地在Java栈和本地方法栈之间跳转。

JVM本地方法栈/虚拟机栈_第1张图片

二.为何要使用Native Method

java使用起来很是方便,然而有些层次的任务用java实现起来不容易,或者咱们对程序的效率很在乎时,问题就来了。

与java环境外交互:

有时java应用须要与java外面的环境交互。这是本地方法存在的主要缘由,你能够想一想java须要与一些底层系统如操做系统或某些硬件交换信息时的状况。本地方法正是这样一种交流机制:它为咱们提供了一个很是简洁的接口,并且咱们无需去了解java应用以外的繁琐的细节。

与操做系统交互:

JVM支持着java语言自己和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些链接到本地代码的库组成。然而无论怎 样,它毕竟不是一个完整的系统,它常常依赖于一些底层(underneath在下面的)系统的支持。这些底层系统经常是强大的操做系统。经过使用本地方法,咱们得以用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调用。

虚拟机栈

StackOverflowError代表的是,当栈深度超过虚拟机分配给线程的栈大小时就会出现此error
OutofMemoryError代表的是,当再申请新的内存时,虚拟机分配给线程的内存大小中无法再分配新的内存,就会出现此error

栈空间内存设置过大,创建线程数量较多时会出现栈内存溢出OutofMemoryError。同时,栈内存也决定方法调用的深度,栈内存过小则会导致方法调用的深度较小,如递归调用的次数较少。

自定义栈的大小
-Xss1m
-Xss1024k

你可能感兴趣的:(spring,java,mvc)