虚拟机栈(VM Stack)

虚拟机栈(VM Stack)

在这里插入图片描述
在这里插入图片描述

1.是线程私有的区域
2.和pc Register一样,跟线程生命周期相同,每个线程分配一个独立的vm stack
3.没执行一个方法都同步创建一个该方法的stack frame(栈帧),方法执行完毕的过程,就对应着一个栈帧在VM Stack中从入栈道出栈的过程。
4.每一个栈帧stack frame包含局部变量表、操作数栈、方法返回值、动态链接
5.局部变量表包含:基本数据类型、引用、returnaddress类型。是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。
6.变量槽:是局部变量表的最小单位,来存量数据。
注意:
很多人说:基本数据和对象引用存储在栈中。当然这种说法虽然是正确的,但是很不严谨,只能说这种说法针对的是局部变量。局部变量存储在局部变量表中,随着线程而生,线程而灭。并且线程间数据不共享。但是,如果是成员变量,或者定义在方法外对象的引用,它们存储在堆中。因为在堆中,是线程共享数据的,并且栈帧里的命名就已经清楚的划分了界限 : 局部变量表!

JVM虚拟机运行时,VM stack的运行结构

      由上图可知,程序运行时,栈内存中由多个运行线程组成,线程并发执行,每个线程相互独立,互不干扰,所以说栈内存是线程私有的。而每一个线程由多个栈帧组成,每一个栈帧代表一个方法的运行,最先执行的方法进去栈顶,也就是图中的栈帧1,当栈帧1方法执行过程中又调用方法2时,这时候栈帧2进入栈顶,以此类推,栈帧3…栈帧n到当前栈帧。所以总结说: 一个线程中的方法调用链可能会很长,以Java程序的角度来看,同一个时刻,同一条线程里面,在调用虚拟机栈的所有方法都同时处于执行状态。而对于jvm虚拟机执行引擎来说,在活动线程中,只有位于栈顶的方法才是运行的,只有位于栈顶的栈帧才是生效的,被称为“当前栈帧”。

1.局部变量表

      局部变量表是一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量(max_locals的值为局部变量表的变量个数值)。

2.操作数栈

      操作数栈也叫操作栈,是一个后入先出的栈结构(max_stacks表示操作数栈的最大深度)。当一个方法刚开始执行时,这个方法的操作数栈是空的,在方法执行过程中,会有各种指令往操作数栈中写入和提取数据,也对应操作数栈的出栈和入栈操作。

3.动态连接

      符号引用指的是class文件常量池中每个方法的引用,这里的引用是静态的,与之相对应的就是动态连接,方法调用的时候,会将符号引用转为直接引用,这一过程为动态连接

4.方法返回地址

      当一个方法执行后,只有两个方式退出方法:
          a.执行引擎遇到退出指令,这个时候可能会有返回值传递给上层方法调用者,这种退出方法给正常完成出口。
          b.另一种是抛出异常退出,异常退出不会给上层调用者产生任何返回值。无论何种方式,都需要返回到被调用的位置。正常退出时,调用者的PC计数器的值可以作为返回地址。
方法退出实际上就是当前栈帧出栈。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值