java虚拟机栈


1.虚拟机栈概述
栈是运行的单位(程序如何运行),堆是存储的单位(数据存储问题)

Java虚拟机栈:
也称Java栈,每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的Java方法调用,线程私有
生命周期:生命周期和线程一致
作用:主管Java程序的运行,它保存方法的局部变量,部分结果,并参与方法的调用和返回
局部变量VS成员变量(或属性)
基本数据变量 vs 引用类型变量(类,数组,接口)
栈的特点:
栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器
JVM直接对Java栈的操作只有两个
每个方法执行,伴随着进栈(入栈,压栈)
对于栈来说不存在垃圾回收问题

2.栈的存储单位

每个线程都有自己的栈,栈中的数据都是以栈帧(Stack Frame)的格式存在
在这个线程上正在执行的每个方法都各自对应一个栈桢
栈帧是一个内部区块,是一个数据集,维系着方法执行过程中的各种数据信息

运行原理:

1.JVM直接对Java栈操作只有两个,就是对栈帧的压栈和出栈,遵循“先进后出”/“后进先出”原则
2.在一条活动线程中,一个时间点上,只会有一个活动的栈帧。即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈帧被称为当前栈帧,与当前栈帧相对应的方法就是当前方法,定义这个方法的类就是当前类。
3.执行引擎运行的所有字节码指令只针对当前栈帧操作进行
4.如果在该方法中调用了其他的方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前帧!

3.局部变量表

局部变量表也被称之为局部变量数组或本地变量表
定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用,以及returnAddress类型
由于局部变量表时建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题
局部变量表所需的容量大小是编译确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的
方法的调用的次数由栈的大小决定
局部变量表中的变量只在当前方法调用中有效
最基本单位是slot()

局部变量表中的变量也是重要的垃圾回收节点,只要被局部变量表中直接或间接引用的对象都不会被回收;

4.操作数栈

栈:数组或链表实现
每个独立的栈帧中除了局部变量表以外,还包含一个先进先出的操作数栈
在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈/出栈
如果被调用的方法带有返回值的话,其返回值将会被压入当前栈帧的操作数栈中,并更新PC寄存器中下一条需要执行的字节码指令
Java虚拟机的解释引擎是基于栈的执行引擎,其中栈指的就是操作栈。

5.代码追踪
6.栈顶缓存技术
7.动态链接

每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。
包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking),比如:invokedynamic指令
在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在class文件的常量池里,程序运行时将其加载进方法区的运行时常量池中。
比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。

8.方法的调用:解析与分派
9.方法返回地址
10.一些附加信息
11.栈的相关面试

异常:
Java 虚拟机规范允许栈的大小是动态的或者固定不变的
1.如果采用固定大小的Java虚拟机栈,那每一个线程Java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机就会抛出一个StackOverflowError
2.如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程没有足够的内存区创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutMemoryError异常

设置栈内存大小:-Xss256k
网址:https://docs.oracle.com/en/java/javase/
https://docs.oracle.com/en/java/javase/11/tools/tools-and-command-reference.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值