当前位置: 首页 > 科技观察

JVM系列的虚拟机栈

时间:2023-03-12 04:53:21 科技观察

一说。今天继续分享JVM系列的相关知识。今天给大家介绍一下虚拟机栈的介绍。1.虚拟机栈的概念虚拟机栈也叫Java栈。Java的每一个main方法执行时,JVM会同步创建一个栈帧(StackFrame),通过存储局部变量表、操作数栈和动态链接。、方法退出等信息来支持和完成方法的执行。堆栈帧是虚拟机堆栈中的一个子单元。栈实际上只有两种操作:push和pop。栈的入栈操作:每调用一个方法,就会将一个对应的栈帧入栈,也称为入栈。出栈:方法调用结束后弹出,也叫出栈。2、虚拟机栈的特点是基于先进后出的原则。线程是私有的,其生命周期与线程一致,随线程而生,随线程而灭。如果线程请求的栈深度大于虚拟机允许的最大深度,则会抛出StackOverflowError栈溢出异常。虚拟机栈可以动态扩展,如果扩展获取不到足够的内存,会抛出OutOfMemoryError异常。运行时常见异常NullPointerException-空指针引用异常ClassCastException-类型转换异常IllegalArgumentException-传递非法参数异常ArithmeticException-算术计算异常IndexOutOfBoundsException-下标越界异常NumberFormatException-数字格式异常UnsupportedOperationException-不支持的操作异常3.Stack各进程javaframe中的方法从开始调用到执行完成其实对应的是虚拟机线程中一个stackframe从push到pop的过程。4.栈帧的组成栈帧由局部变量表、操作数栈(OperandStack)、动态链接(DynamicLinking)、方法返回地址(ReturnAddress)和一些附加信息(informationthat支持程序调试)。解释:在活动线程中,只有栈顶的栈帧称为当前栈帧,也是正在执行的方法。Java执行引擎运行的所有字节码指令,实际上只对当前栈帧进行操作。4.1局部变量表主要存放各种基本数据类型(boolean,byte,char,short,int,float,long,double),对象引用(引用类型,不是针对对象本身的,可能是引用指针指向对象的起始地址,也可能是代表性对象的句柄或相对于该对象的其他位置)。4.2操作数栈操作数主要作为方法调用的中转站,主要用来存放Java方法执行过程中产生的中间计算结果和计算过程中产生的临时变量。4.3动态链接动态链接主要支持Java方法需要调用其他方法的场景。当一个Java源文件被编译成字节码文件时,所有的变量和方法引用都作为符号引用(SymbilicReference)存储在Class文件的常量池中。当一个Java方法调用另一个Java方法时,需要将常量池中指向该方法的符号引用转换为内存地址中的直接引用。动态链接功能:其实就是将符号引用转化为对调用方法的直接引用。4.4方法返回地址Java方法开始执行后,退出该方法的方式:正常退出、异常退出。正常退出:执行引擎遇到方法返回的字节码指令。这时候可能会将返回值传递给上层的方法调用者。正常退出时调用PC计数器的值可以作为返回地址。异常退出:当方法执行过程中遇到异常,并且在方法体中没有对异常进行处理时,必须将返回地址交给异常处理表来决定如何处理。注意:方法退出后,需要回到原来调用方法的位置,这样程序才能继续执行。5.栈的优缺点优点:栈帧内数据共享:内存数据在一个栈帧内共享,不同栈帧之间不共享数据,可以减少内存消耗存储速度:栈帧访问数据快,仅次于注册。编译时分配内存,运行过程中无需申请内存大小,节省时间和成本。栈是机器提供的一种数据结构。计算机会分配一个专门的寄存器来存放栈的地址。入栈出栈都有专门的指令,效率很高。与堆相比,访问效率高。缺点灵活性差:在栈操作过程中,不能动态申请内存,程序可能会报错。6.栈和堆在内存中的比较栈属于运行单元,主要解决程序如何执行的问题,堆属于存储单元,主要用来解决数据存储问题.堆是运行时数据区的较大部分,所以Java对象基本上都放在堆空间中。栈主要用于存放基本数据类型的局部变量和引用数据类型对象的引用