Jvm内存分配(5)

下面的内容全部来自网络,基本无原创。只是学习笔记而已。

3.3 -Stack

保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。

A jvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

B 某个线程正在执行的方法称为此线程的当前方法。当前方法使用的帧称为当前帧。当前方法所属的类称为当前类。当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前的类和常量池。当jvm会在当前帧内执行帧内数据的操作。

C 当线程激活一个java方法,jvm就会在线程的java堆栈里新压入一个帧。这个帧自然成为了当前帧。在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据。

D 一个方法可以以两种方法结束。一种是正常返回结束。一种是通过异常抛出而异常结束(abrupt completion)。不管以那种方式返回,jvm都会将当前帧弹出堆栈然后释放掉,这样上一个方法的帧就成为当前帧了。

E  Java栈上的所有数据是私有的,其他线程都不能该线程的栈数据。

F 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

G  java堆栈和帧在内存中也不必是连续的。帧可以分布在连续的内存区,也可以不是。帧的数据结构由jvm的实现者来决定,他们可以允许用户指定java堆栈的初始大小或最大最小尺寸。

 

Stack 结构 如下图


 

3.3.1 堆栈帧( The Stack Frame)

每个java线程执行一个方法时候,会在stack里面压入一个帧(堆栈帧)

堆栈帧有三部分:局部变量区,操作数堆栈和帧数据区。局部变量区和操作数堆栈
的大小要视对应的方法而定。编译器在编译的时候就对每个方法进行了计算并放在
了类文件(class file)中了。帧数据区的大小对一种jvm实现来说是一定的。
jvm激活一个方法时,它从类信息数据得到此方法的局部变量区和操作数堆栈的
大小,并据此分配大小合适堆栈帧压入java堆栈中。

3.3.1.1 局部变量区-(本地变量区)

包括输入参数和输出参数以及方法内的变量

A 局部变量区被组织为以一个字长为单位、从0开始计数的数组

B 类型为shortbytechar的值在存入数组前要被转换成int值,而long double在数组中占据连续的两项
C
在访问局部变量中的longdouble时,只需取出连续两项的第一项的索引值即可,如某个long值在局部变量 区中占据的索引时34项,取值时,指令只需取索引为3long值即可(不明白)

 

方法参数和局部变量在局部变量区中的存储结构



 1 RunClassMethod 静态方法

2 RunInstanceMethod 非静态方法

  第一项是个reference(引用),它指定的就是对象本身的引用,也就是我们常用的this

 

 

3.3.1.2 操作数堆栈

操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。 可把操作数栈理解为存储计算时,临时数据的存储区域。

 

下面我们通过一段简短的程序片段外加一幅图片来了解下操作数栈的作用

 

int a = 100;

int b = 98;

int c = a+b;



 从图中可以得出:操作数栈其实就是个临时数据存储区域,它是通过入栈和出栈来进行操作的。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值