JVM对象的创建与访问定位

一、JVM中对象的创建

JVM中创建对象的过程可以分为以下几步:

1.当JVM遇到一条new指令时,首先去检查这个指令的参数能否在常量池中定位到一个类的符号引用,并检查这个符号代表的类是否被加载,解析和初始化过。若没有,应先加载该类。

2.若类已被加载,需要在内存中为其分配相应的空间。这里提一下内存空间的维护,有两种方式,一种时采用指针碰撞的方式,即维护一个指针用于记录空闲的内存空间的地址,当为对象分配地址空间之后,指针进行相应的移动。

 

或者采用空闲列表记录系统中可用的内存地址空间。

 

3.接下来,再思考一个问题,如果在多线程环境下进行对象的创建。如果系统为线程A分配了地址空间,同时线程B也来创建对象,此时维护堆内存空闲空间的指针来不及移动,导致系统为线程B分配了同一片内存空间,那么这将存在线程不安全的问题。因此,对象的创建是需要考虑线程安全的。 

解决的方案有两种,一是采用CAS+失败重试操作(while循环)二是将内存空间进行划分,使得每个线程操作属于自己的那份内存(ThreadLocal)来保证线程之间不会发生冲突。可通过 -XX:+/-UseTLAB来设定虚拟机是否使用本地线程分配缓冲(ThreadLocal Allocation Buffer)。

4.在内存分配完成后,JVM必须将所分配到的内存空间初始化为零值。

5.接下来,JVM还需要对对象进行必要的设置,例如对象的Hash码,GC分代年龄,对象是哪个类的实例等等。

6.接下来执行对象的构造函数,并根据相应的构造函数对对象中的属性值进行初始化。注意在执行构造函数时,所有对象成员变量使用的默认的初始化值(即0,null这些),在构造方法完成后会紧接着执行Init()方法,此时对相应的成员变量进行赋值。

二、对象在内存中的组成

1.对象头

对象头中主要包含两类数据。一类用于存储对象自身的运行时数据,如哈希码,锁状态表只,线程持有锁等。这部分的程度通常为32/64位(根据32/64位系统来确定)。另一类是类型指针,即对象指向它的类型元数据指针。该指针的作用主要是用来确定对象属于哪个类。另外如果对象是一个数组,对象头中还需要维护一个记录数组长度的字段。

2.对象的有效信息

这部分数据是我们在程序代码里定义的各种类型的字段内容。这部分数据的存储顺序受到虚拟机分配策略参数和字段定义顺序的影响。

补充一下,HotSpot中字段定义的默认顺序为:

long/double      int      short/char    byte/boolean   oop(自定义对象)

相同宽度的字段会被分配到一起存放

父类对象出现在子类之前

另外,将 +XX:CompactFields 的参数值设为true后允许子类中较窄的变量插入父类变量的间隙中。

3.对齐补充

这部分没有什么实际意义,只是为了使得对象大小为8字节的整数倍,也就是说属于补齐缺少的字节的部分。(HotSpot虚拟机的自动内存管理系统要求对象的起始地址必须是8字节的整数倍

三、对象的访问定位

对象的定位主要是通过JAVA栈上的reference引用来实现的。通常情况下,reference引用定位到堆内对象的方式有两种:

1.句柄访问

 

如图,堆空间中会开辟一块空间作为句柄池,reference引用记录对象的句柄地址。句柄中包含了对象的实例数据和类型数据的地址信息。通过这些地址信息,从实例池/方法区中找出中找出对应的数据。

优点:reference中仅存储句柄地址,在垃圾回收算法(主要是针对标记-整理算法)移动对象时,并不会改变reference中的值,而是改变句柄池中的值。

缺点:访问速度太慢,需要两次定位。

2.直接指针访问

 

如图,reference中直接记录对象的数据的地址,通过该地址可直接访问对象相应的数据。

优点:访问速度快

缺点:对象移动时,维护reference的成本较高

但考虑到对象访问在JAVA中是一件非常频繁的事,因此,HotSpot采用的是直接指针访问的方式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值