hotspot虚拟机中java对象的分配与布局和访问

本文是对虚拟机学习的个人总结,参考了深入理解java虚拟机一书,如果有不正确的地方欢迎指正

1.对象的在虚拟机中的分配

①虚拟中对象的创建,当虚拟机收到一条new指令的时候,会在常量池中找到这个类的引用,并且会检查这个类是否被加载,解析和初始化过,如果没有那会先执行相应的过程。

②当类的加载检查通过后,虚拟机接下来会为对象类分配内存,其中类需要的内存大小会在类加载完成后确定,其中对于内存的分配存在指针碰撞和空闲列表两种方式,具体使用哪种分配方式取决于java内存的对是否规整。而在多线程情况下还要考虑同步问题,在这种情况下,虚拟机一般采取CAS和把内存分配的动作按照线程划分在不同的空间之中。其中第二种情况即为每个线程在堆中预先分配一小块内存,这块区域被称为TLAB(本地线程缓冲),那个线程要分配内存首先要在自己的TLAB上先分配,只有当TLAB用完分配新的TLAB时候才需要使用同步。

③当内存分配完成后,虚拟机会将分配的内存空间都初始化为0,这个过程中对象头除外,从而保证了对象实例字段可以在代码中不赋值直接使用也保证了初始访问类中的属性时都是初始化的值。

④虚拟机会对对象进行必要的设置,包括这个这个对象是哪个类的实例,如何找到对象的哈希码,对象的GCf分代信息,这些信息存放在对象的对象头中。

当虚拟机完成上述步骤一个对象已经在虚拟机中初始化完成,而类的其他信息将由类的构造方法完成,这时候类中属性的值可以由调用者自由确定。

二.对象的内存布局

对象在内存中的存储布局可以分为三块区域,包括对象头,实例数据和对齐填充。

①对象头

对象头一般存储两部分信息:对象运行时的数据和对象的类型指针,其中虚拟机通过类型指针来确定对象对应哪个类但是请注意并不是所有与虚拟机都会保存虚拟机对象的类型指针

②实例数据

实例数据存放对象的各种有用信息包括对象继承哪个类以及程序中定义的个字段的内容,当然也包括从父类中继承的

③对其填充

用来使起占位符的作用保证对象中的实例数据没有对齐是进行对齐

三对象的访问

对象创建完成之后由虚拟机的具体实现决定对象的具体访问方式,一般包括使用句柄和直接指针两种方式。

如果采用句柄访问方式,那么java会在堆中划分出一块内存创建句柄池,其中句柄存放着对象示例数据和各示例数据的具体地址信息若采用直接指针方式那么java堆中存放的将会是对象中各访问数据的具体信息其中使用直接指针访问的方式对象的访问速度更快,并且节省了创建句柄的开销,在hotspot中采用的就是第二种方式。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值