假如Java对象是个人······

假如Java对象是个人,那意味着它也具备了我们人所有的东西,头,身体,大长腿。

头就是我们的对象头(Header)。根据JAVA虚拟机规范,我们的对象头分为两部分,分别是存储对象自身的运行时数据和存储类型指针。

存储对象自身的运行时数据

这部分数据有HashCode、GC分代年龄、对象锁信息等。数据长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为Mark Word。

如下图所示:

hashcode 是对象内存地址信息通过哈希算法得到的int类型数据。

GC分代年龄  作用于GC回收时给对象做标记,新生代的对象每经历一次GC如果没有被回收的情况下,GC分代年龄+1,类似于我们人类长大了一岁,默认15是个临界点(可以通过JVM配置),当对象长到15岁的时候会从新生代转移到老年代。

对象锁信息 包含了锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这里由于自己了解不够深,所以不一一详细介绍以免误导。大概谈到一点,我们平时的代码如果不是类级别的synchronized锁,那么锁的都是该类对象的对象头,谁抢到对象头的锁谁先用。锁信息上面会记录抢到该锁的线程id,调用完方法后记录清除,其他线程开始新一轮的抢夺。

存储类型指针

类型指针,JVM通过该指针来判断该对象属于哪个类。

身体

身体就是对象的 实例数据(Instance Data),即我们在代码中定义的每个字段的具体内容,不管是从父类继承还是自身的,都会存储到该实例数据里面。

大长腿

大长腿就是整位补齐(Padding),依据JVM虚拟机规范定义,对象所占空间必须是8字节的整数倍,所谓“身高不够,工资来凑”是形容我们男同胞的,那么java对象字节不够的时候,就靠整位补齐来凑了。在这里整位补齐没有多余含义,仅仅是起着占位符的作用。

转载于:https://www.cnblogs.com/missOfAugust/p/9524829.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值