HotSpot虚拟机对象探秘

一、对象的创建

  1. 仅限普通对象,虚拟机遇到new指令时,首先先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个类是否已被加载,解析和初始化过。如果没有,那必须先执行相应的类加载过程
  2. 接下来,虚拟机将为新生对象分配内存。(对象所需内存大小在类加载时可以确定)。由堆内存是否规整确定以指针碰撞或采用空闲列表分配方式。由于分配内存十分频繁,所以并发时,有两种方案,一种是在分配内存时采用CAS配上失败重试的方式保证更新操作的原子性;另一种是把内存分配的动作按照线程划分在不同的空间之中进行。即预先为每个线程分配一小块堆空间。称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)。

二、对象的内存布局

  对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

  1. 对象头包含两部分信息,第一部分是用于存储对象自身的运行时数据,如哈希码、GU分代年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳等,这部分数据的长度32/64bit有32/64位虚拟机决定。另一部分是类型指针,通过改指针确定是哪个类的实例。
  2. 实例数据是对象真正存储的有效信息,默认分配策略longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers)。相同宽度字段会被分配在一起。
  3. 对齐填充不一定存在,为对象实例数据补充对齐为8字节的倍数。

三、对象的访问定位

  对象的创建是为了使用,java程序会通过栈上的reference数据来操作堆上的具体对象,对象的访问方式有虚拟机实现决定,主要有以下两种访问方式

  1. 句柄(堆中对象的地址)访问,java堆中会划分一块内存作为句柄池,refercence中存储的就是对象的句柄地址,而句柄中包含了对象实例对象数据与类型数据各自的具体地址信息
  2. 直接使用指针访问就必须考虑如果放置类型数据的相关信息

 

转载于:https://www.cnblogs.com/yasashi/p/11078446.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值