jvm
- Java虚拟机栈
- 本地方法栈
Java虚拟机栈
Java虚拟机栈(VM Stack)
虚拟机栈是线程执行Java程序时,处理Java方法中内容的内存区域。虚拟机栈也是线程私有的区域,每个Java方法被调用的时候,都会在虚拟机栈中创建出一个栈帧,而每个栈帧又由局部变量表、操作数栈、动态链接和方法返回四部分组成,有些虚拟机的栈帧还包括了一些附加信息。
JMM内存区域可以粗略的区分为堆内存(Heap )和栈内存( Stack )。其中栈就是VM Stack虚拟机栈,或者说是虚拟机栈中局部变量表部分。
局部变量表主要存放了编译期可知的各种基本数据类型变量值( boolean、 byte、char、short、 int、float 、long、double )、对象引用( reference类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。
虚拟机栈运行原理:
每一次方法调用都会有一个对应的栈帧被压入VM Stack虚拟机栈,每一个方法调用结束后,代表该方法的栈帧会从VM Stack虚拟机栈中弹出。
虚拟机栈是线程的私有区域,并且栈帧不允许被其他线程访问,所以不存在线程安全问题,栈帧弹出后就内存就会被系统回收,所以不也存在垃圾回收问题。
在活动线程中,只有位于栈顶的帧才是有效的,称为当前活动栈帧,代表正在执行的当前方法。
在JVM执行引擎运行时,所有指令都只能针对当前活动栈帧进行操作。虚拟机栈通过pop和push 的方式,对每个方法对应的活动栈帧进行运算处理,方法正常执行结束,肯定会跳转到另一个栈帧上。
活动栈帧被弹出的方式:
. Java方法有两种返回方式,不管哪种返回方式都会导致当前活动栈帧被弹出
。return语句
。抛出异常
虚拟机栈可能产生的错误:
Java虚拟机栈会出现两种错误:StackOverFlowError和OutOfMemoryError。
StackOverFlowError:当线程请求栈的深度超过VM虚拟机栈的最大深度的时候,就抛出StackOverFlowError错误。
OutOfMemoryError:JVM的内存大小可以动态扩展,如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
虚拟机栈的大小
虚拟栈的大小可以通过-Xss参数设置,默认单位是byte,也可以使用k ,m,g作为单位(不区分大小写)。例如:-Xss 1m
在不同操作系统下的-Xss 默认值不同
。Linux : 1024k
。MacOs : 1024k
。windows :默认值依赖于虚拟机的内存
本地方法栈
本地方法栈(Native Method Stack)
本地方法栈用于虚拟机调用的Native方法
native关键字修饰的本地方法被执行的时候,在本地方法栈中也会创建一个栈帧,用于存放该native本地方法的局部变量表、操作数栈、动态链接、方法出口信息。方法执行完毕后,相应的栈帧也会出栈并释放出内存空间。也会出现StackOverFlowError和OutOfMemoryError两种错误。