jvm学习---虚拟机栈

1.1什么是jvm栈

虚拟机栈:jvm中用于主管java程序的运行,它保存方法的局部变量,部分结果,并参与方法的调用和返回的栈。

1.2jvm栈的优缺点

优点:跨平台,指令集小,编译器容易实现

缺点:性能下降,实现相同操作需要更多指令。快速有效的分配存储方法,访问速度仅次于PC寄存器。只有入栈和压栈,没有垃圾回收问题,存在OOM问题

1.3jvm栈的介绍

区分于堆主要是,栈存放运行时单位,堆是存储的单位

是线程私有的,声明周期与线程保持一致

线程请求分配的栈容量超过java虚拟机栈允许的最大容量,java虚拟机将会抛出StackOverflowError

如果java虚拟机可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程是没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个OutOfMemoryError

1.4栈中存放什么

每个线程都有自己的栈,栈的数据是栈帧。

而每个方法都各自对应一个栈帧,栈帧是一块内存块,是一个数据集,维系着方法执行过程中的各种数据信息

当前执行的方法的栈帧是当前栈帧,当前方法所属类为当前类,执行引擎运行的所有字节码指令只针对当前栈帧

如果该方法调用了其他方法,则会创建新的栈帧,放在栈的顶端

1.5栈运行原理

不同线程不能使用同一个栈帧,线程隔离了不同的栈。

当前方法执行其他方法,方法返回之际,当前栈帧返回此方法结果。

不管是方法正常return还是抛出异常。栈帧都会被弹出

1.6栈帧的内部结构

局部变量表,操作数栈(表达式栈),动态链接(指向运行时常量池的方法引用),方法返回地址(方法正常退出或者异常退出),一些附加信息

1.6.1 局部变量表(本地变量表,局部变量数组)

定义一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,基本数据类型,对象应用,returnAddress类型

因为jvm栈是线程独有的,不会有安全问题。

所需大小在编译器确定,后面不会在更改了

下表及时上表的局部变量表

 

 栈帧大小主要有局部变量表决定,局部变量表只在当前栈帧有限。调用时,直接调用局部变量表中的变量

1.6.2,局部变量表的基本单位------>Slot(变量槽)

局部变量表中存放8种基本数据类型,引用数据类型,returnAddress类型,其中32位以内的站一个Slot,64位站两个。

在局部变量中,按照声明的先后存放在Slot当中,构造方法和实例方法会在索引为0的位置存放this

如果变量过了作用域,则回收Slot,继续利用

 

 

 局部变量表局调优有很大关系,调用引用数据类型的时候,栈指向堆中的对象是决定该对象是否为垃圾的标志。

 

posted @ 2021-01-23 10:43  L三木1121  阅读(59)  评论(0编辑  收藏  举报