jvm内存模型栈帧原理—从根儿上理解jvm(二)

回顾

jvm是如何运行的—从根儿上理解jvm(一)中,我们首先从抽象(深刻理解抽象很重要!!!)的层面定义虚拟机,jvm的位置,jvm启动,jvm的体系结构,类加载器。今天我们将继续学习java虚拟机。

jvm内存模型

根据冯诺依曼计算机体系结构(抽象化的计算机,反复强调抽象,是希望大家慢慢领悟抽象的伟大),控制器执行的是存储器中的数据。java程序如果要跑起来,首先就是把磁盘中的文件(字节码文件),加载(类加载器)到内存中。我们接下来揭开jvm中内存结构的面纱,了解真实的程序执行过程。

运行时数据区

jvm运行时数据区,是Java虚拟机在运行时对该Java进程占用的内存进行的一种逻辑的划分,包括方法区、堆内存、虚拟机栈、本地方法栈、程序计数器。这些区块实际都是Java进程在Java虚拟机的运作下通过不同数据结构来对申请到的内存进行不同的使用。
在这里插入图片描述

  • 方法区(永久代),目前大家使用的都是java 8 之后的版本,之前的称为方法区,java8和之后的为元数据空间。两者存储的位置是不同的,方法区在jvm的堆中,而元数据空间脱离于jvm堆,存在于本地内存中。之所以废弃永久代,设想如果存在于永久代中,随着项目的不断增加,类加载器加载的类不断增加,所需的内存空间不断增大,容易导致内存溢出。防止内存溢出,设置过大,也是对内存的浪费。为了便于理解,如上图,把方法区和java堆看做是线程共享区,思考咱们的代码哪些是线程共享的(类信息,常量区,即时编译器编译(JIT)后的代码等)
  • 虚拟机栈:线程独占,多少线程就会有多少虚拟机栈,每个虚拟机栈,由很多的栈帧组成,是方法运行的重要结构。
  • 程序计数器:记录当前线程所执行到的字节码的行号。操作系统我们知道,cpu的执行速度,远远大于从内存中读取数据的速度,为了防止cpu空转,让cpu支持远大于cpu数量的任务同时执行,设计出了cpu上下文(cpu寄存器和程序计数器),注意这是两类不同的程序计数器,但是用到的思想是一致的,保留上下文环境。

栈帧(stack frame)

什么是栈帧

每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录,是编译器用来实现过程函数调用的一种数据结构。
栈数据结构的特点就是先进后出(FILO),天然的符合函数调用。
栈顶(Top):线性表允许进行插入和删除的一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。

组成

在这里插入图片描述
如上图,大家可以清楚的认识到java栈是由一个个栈帧组成,每一个栈帧我们可以理解为一个个的函数,最先入栈的是第一个函数调用(如main函数),之后按照函数的调用过程,依次进栈和出栈,结合代码我们更容易理解。

class testStack {

static int b=2;
public static int a = 1;

public static int divisor = 2;

public int add(){
    int b = 3;
    int c = 12;
    return (a+b)/divisor+c;
}
     void main(){
       add();
    }
}

对上述代码编译结果:
在这里插入图片描述
add栈帧在内存中的运行过程:
在这里插入图片描述
由此我们可以得知:

  • 局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量
  • 操作数栈(Operand Stack)也常称为操作栈,它是一个后入先出栈。当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈和入栈操作
  • 方法返回地址当一个方法开始执行后,只有两种方法可以退出这个方法。第一种方法是执行引擎遇到任何一个方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者,是否有返回和返回值的类型将根据遇到何种方法返回指令来决定,这种退出方法的方式称为正常完成出口。另外一种退出方法是,在方法执行过程中遇到异常,并且这个异常没有在方法体内得到处理,就会导致方法退出,这种退出方法的方式称为异常完成出口。
    方法退出的过程实际上就等同于把当前栈帧出栈,因此退出时可能执行的操作有:恢复上层方法的局部变量表和操作数栈,把返回值压入调用者栈帧的操作数栈中,调整PC计数器的值以指向方法调用指令后面的一条指令等。

小结

jvm是java程序运行的基石,学好jvm对能更好的理解java程序是如何运行起来的。接下来将会继续陪跑学习jvm的编译器(JIT),从根上了解为什么java语言被称为编译和解释型语言。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值