虚拟机栈
2021-09-13 13:18:21 0 举报
虚拟机栈
作者其他创作
大纲/内容
概 述
虚拟机栈是随着线程的创建而创建,内部存储着一个个栈帧,对应着一次次的方法调用。
如果方法在编译器就确定下来版本,且在运行期间保持不变,那么这个方法就是 静态方法、私有方法、final修饰的、父类方法、构造方法等都是非虚方法。其他的则称之为虚方法 非虚方法表是在字节码文件在类加载子系统中的链接阶段中当类的变量初始值准备完之后,JVM也会该类的创建非虚方法表存储在方法区中。
静态链接:当字节码文件被装载进JVM内部时,如果被调用的目标方法在编译器已知,且在运行期间保持不变,这种情况将调用方法的符号引用替换直接引用的过程。 动态链接:被调用的目标方法在编译器无法确定下来,只能够在程序运行期间将方法的符号引用转换为直接引用,这个过程称为动态链接。
012n
栈 顶 缓 存 技 术
方法n
intlongObject
方法的结束情况分为:正常执行结束和异常退出。正常完成出口和异常完成出口的区别在于: 通过异常完成出口一般不会给他的上层调用者产生任何的方法返回值。 正常退出的情况下,方法返回地址存储的就是PC寄存器的值,即存储的就是调用该方法指令的下一个指令地址。而异常退出,则方法返回地址会在异常表中存储,栈帧中不会保存这个信息
动态链接
栈顶
局部变量表
栈底
815return
方法的调用
一 些 附 加 信 息
方法2
绑定机制
非虚方法
JVM的架构模型是基于栈的指令集方式,而栈的特点就是先进后出/后进先出原则(Last In First Out)。程序在运行时当方法被调用,则将数据存入栈中,即入栈操作;而当方法结束时,将数据从栈中提取出来,即出栈操作。栈只有入栈/出栈操作,不存在垃圾回收。
每个栈帧内部都包含一个指向运行时常量池该栈帧对应所属方法的变量引用,包含这个引用的目的就是为了支持 动态连接的作用就是为了将编译过程的符号引用替换为调用方法的直接引用。
与动态链接和静态链接对应的绑定机制有:早期绑定和晚期绑定。绑定是一个字段、变量在符号引用替换为直接引用的过程,仅仅发生一次。 早期绑定:如果被调用的目标方法编译器已知,且运行期间保持不变,因此可以使用静态链接的方式将符号引用替换为直接引用。 晚期绑定:如果被调用的方法在编译器无法确定下来,只有在运行期才可以根据实际的类型绑定相关的方法。
栈帧1
方法返回地址
操作数栈
补充
相关面试题
在操作数栈中,频繁的入栈/出栈进行读写操作,必然会影响到执行性能,为了解决这个问题,设计出将栈顶的数据缓存到物理的寄存器中,以此降低对内存的读/写操作,提高性能。
......
局部变量表也成为局部变量数组或本地变量表,存储数据从索引index0开始,直到数组长度-1的索引结束。用来存储方法内部的局部变量、参数引用、对象引用、方法返回地址。局部变量表是私有的,不可共享的,仅在当前栈帧内有效它的最小单元是
作 用
内 部 结 构
类型
📕 举例栈溢出的情况? (StackOverflowError) ·通过-Xss设置栈的大小;OOM 📕 调整栈大小,就能保证不出现溢出吗?不能·分配的栈内存越大越好吗?不是! 📕 垃圾回收是否会涉及到虚拟机栈?不会的! 📕 方法中定义的局部变量是否线程安全?具体问题具体分析
栈内深度:32位以内的类型占用一个能量槽(byte、short、int、float、boolean (0代表false,1代表true) ),64位的类型占用两个能量槽(long、double)。访问64位的数据类型,使用前一个能量槽即可。 能量槽复用:当一个方法内有的局部变量超过指定作用域之后,其作用域之后申明的新变量有可能会复用之前过期的能量槽。 在栈帧中,与性能调优最密切的部分就是局部变量表,方法执行时,返回方法的调用结果。同时,在垃圾回收机制中,局部变量表中的变量也是重要的根节点对象,只要被变量直接或间接引用的对象都不会被回收
栈帧中还允许携带与Java虚拟机实现相关的附加信息,例如:对程序调试提供支持的信息
栈帧n
虚 方 法 和 非 虚 方 法
虚拟机的生命周期与线程一致。
生命周期
虚拟机栈是Java程序执行的单元,堆区则是存储的单元。虚拟机栈保存了一些方法的局部变量、部分结果。同时也参与着方法的执行和返回。
操作数栈,在方法执行过程中,往栈内写入数据/读取数据,入栈/出栈操作。主要用于保存计算过程中的中间结果,同时作为计算过程中变量的临时空间。例如:复制、交换、求和等。操作数栈是执行引擎的工作区,通过读取程序计数器的指令,在栈中进行一系列数据操作。和局部变量表一样,32bit位类型存储一个栈单元深度,64bit位类型则存储两个栈单元深度。
特点
Slot能量槽
方法1
基本单元
索引
栈帧2
动 态 链 接 和 静 态 链 接
值
虚 拟 机 栈
0 条评论
下一页