一.栈:在JVM中也叫栈内存,主要负责java程序的运行,栈在线程创建时被创建,栈时线程私有的,也即每一个线程都有自己的栈空间,线程之间的运行不受影响,相互独立

二.栈中存储的基本单位是栈帧,JVM只对栈帧进行进栈,出栈操作,栈帧中的数据它不管.

三.栈帧在方法运行时被创建

四.JVM栈图:

Android jvm 栈优化_java


由上图我们可以看出,栈帧存放的数据主要包括

1.局部变量表:存放了方法参数,以及方法中局部变量的信息

2.操作数栈

3.运行时常量的引用:在一个class文件中,一个方法要调用其他方法,需要将这些方法的符号引用转化为其在内存地址中的直接引用,而符号引用存在于方法区中的运行时常量池

4.方法返回:方法返回有两种方式,一种是正常返回,一种是异常返回,当方法正常执行完毕时,称为正常返回,当方法执行过程中发生异常而返回称为异常返回.

5.附加信息:虚拟机规范允许具体的虚拟机实现增加一些规范中没有描述的信息到栈帧之中,例如和调试相关的信息,这部分信息完全取决于不同的虚拟机实现。

五.栈中存放的数据
1.基本数据类型
2.对象的引用类型(不是对象,对象在堆中)
3.实例方法

六.JVM栈区抛出的异常
在JVM栈这个数据区可能会发生抛出两种错误。

  1. StackOverflowError 出现在栈内存设置成固定值的时候,当程序执行需要的栈内存超过设定的固定值会抛出这个错误。
  2. OutOfMemoryError 出现在栈内存设置成动态增长的时候,当JVM尝试申请的内存大小超过了其可用内存时会抛出这个错误。