JVM学习笔记(二)——虚拟机运行数据区域探索

栈帧的结构:

每一个被线程执行的方法,为该栈中的栈帧,即每个方法对应一个栈帧。

那么栈帧里面包含了什么呢?

请往下看,有如下几种东西:

 

局部变量表(Local Variables):

这里存放着方法中定义的局部变量以及方法的参数,但是局部变量表中的变量并不是直接使用的,使用时必须通过相关指令将其加载至操作数栈中作为操作数使用。

 

操作数栈(Operand Stack)):

存储操作数的地方,这里的操作也是出栈和压栈

动态链接(Dynamic Linking):

栈帧里包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接,这句话用点难理解,具体意思如下:

Class文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用一部分会在类加载阶段或第一次使用的时候转化为直接引用,这种转化称为静态解析。另外一部分将在每一次的运行期期间转化为直接引用,这部分称为动态连接。

 

方法返回地址(Return Address):

当一个方法开始执行后,只有两种方式可以退出,一种是遇到方法返回的字节码指令;一种是遇见异常,并且 这个异常没有在方法体内得到处理。

不管是哪一种方法的退出,都要回到方法被调用的位置,程序才能继续执行。所以栈帧里面需要保存方法返回地址,以便程序恢复方法的执行状态。

 

附加信息:

虚拟机规范允许具体的虚拟机实现增加一些规范里没有描述的信息到栈帧中,但是一般会把动态连接,方法返回地址与其它附加信息全部归为一类,称为栈帧信息。

 

数据区域之间的指向:

既然栈帧中存在局部变量,那么当这个变量是引用类型,如String,那么这时候就是栈中元素指向堆,堆中存着对象,栈中的元素就存着对象的引用地址。

方法区中会存放静态变量,常量等数据。如果静态变量是引用类型,那么这时候方法区的元素也是指向堆的。
 
堆中创建了对象,但是要如何知道对象是哪个类创建的呢?类信息是保存在方法区的,所以这时堆又会指向方法区了
 

 

堆的数据区域划分:

堆的区域分为两部分,一个是 Old 区,一个是 Young 区。
Young 区又分为了两部分,一个是 Survivor 区( S0+S1 ),一块是 Eden 区。 Eden:S0:S1=8:1:1 , S0 S1 一样大,也可以叫 From To
 

Eden区:

新创建的对象是会先到Eden区,但是也有特例,例如占内存空间大的对象会直接到Old区
 
如:创建对象A,B,C,会进入Eden区,但Eden区的内存空间是有限的,如果空间被用完了,这时候就需要对Eden内存空间进行清理,即垃圾收集(Garbage Collect),
这时候的GC称为Minor GC,这个GC为Young区GC。GC后,不是所有对象都会被清除,总会有幸存者,对于幸存者就需要复制到Survivor区,然后再清空Eden区中的
这些幸存者。
 

Survivor区:

同一时间内,From(S0)和To(S1)只能一个空间存在数据,另外一个空间为空。

如:现在Eden区和Form中有对象,To中是空的。
这个时候来次GC,Form区中存活的对象年龄就会+1,Eden区的对象也会复制到To区,From区中还能存活的对象会有两个去处:
一是对象年龄达到之前设置好的年龄阈值,此时对象会被移动到Old区
二是Eden区和From区没有达到阈值的对象会被复制到To区
此时Eden区和From区将会被清空,只留下To区有对象,这时就To变From,From变To,名为To的区域会一直保持空
Minor GC会一直重复这样的过程直到To区被填满,然后会将所有对象复制到老年代中。
 

Old区

Old区都是年龄比较大的对象,或者相对超过了某个阈值的对象。 Old区也会有GC的操作,叫做Major GC。

 

对象的故事:

我是一只对象,出生在Eden,Eden区有很多和我是同一个物种的小伙伴,玩的很开心。但是慢慢的,Eden区的小伙伴越来越多,特别的挤,去哪都是人挤人。

Eden区长下了死命令,抽取部分人到 Survivor的From区去,这里很不稳定,老是在From和To之间来回徘徊。又过了好一段时间,Survivor的区长也来赶人了,要把

像我这种大龄骚年赶走,好吧,又要背井离乡了。走着走着,我来到了Old区,在这里都是大龄的伙伴啊,最后就在这里安享晚年了。

 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值