jvm内存结构

java虚拟机在运行java程序中管理的内存叫做运行时数据区,运行时数据区分为虚拟机栈,本地方法栈,程序计数器,堆,方法区。如图

   一. 程序计数器(线程私有)

程序计数器是用来存储字节码指令地址的,虚拟机在将字节码指令读取到内存中之后,会将源文件中的偏移量转化为内存地址。每个字节码指令都有一个内存地址。在代码执行过程中,程序计数器会记录下一行字节码指令的地址。执行完当前指令后,虚拟机执行引擎会根据程序计数器执行下一行指令。

程序计数器不存在内存溢出问题,因为它本身只存储一个固定长度的内存地址,程序计数器是线程不共享的。所以他不会发生内存溢出。

  二. java虚拟机栈(线程私有)

java虚拟机栈使用栈的数据结构来管理方法调用中的的基本数据,先进后出,每一个方法的调用使用一个栈帧来保存

  栈帧由局部变量表,操作数栈和帧数据组成。

1.局部变量表(线程私有)

存放运行时的一些局部变量,本质是类似一个数组,每一个局部变量对应一个下标,和若干个卡槽,不同类型的局部变量分配的卡槽数量不同int是一个,long是两个。还有this关键字表示当前的实例对象会存储在局部变量表,方法中的参数也会保存在局部变量表中。

局部变量表中的槽是可以复用的,一旦某个变量不在生效时,这个槽可以重新使用。

2.操作数栈(线程私有)

存放一些临时需要使用的数据,比如我们定义一个int类型的变量值为1,字节码指令先将他放入操作数栈中,然后再将他转移到局部变量表中。

3.帧数据

3.1当前字节码指令引用了其他类的属性和方法时,需要将符号引用(编号)转化为常量池中的内存地址,动态链接保存了编号和常量池内存地址的映射关系。

3.2当方法正确执行或者出现异常时都会将当前栈帧弹出,同时返回上一个栈帧中的第一条指令地址,所以帧数据应该存储上一个栈帧的第一条指令地址,这个就叫方法出口。

3.2当出现异常并捕获到时,会生成一个异常表里面存放异常捕获生效的范围和方式异常后跳转的第一条指令。如图

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值