对象(object)的内存布局相关记录

对象的创建过程

 1. class loading(到内存中)
 2. class linking
 3. class initializing
 4. 申请对象内存
 5. 成员变量赋默认值
 6. 调用构造方法
            1.成员变量顺序赋初始值
            2.执行构造方法语句

对象在内存中的存储布局

普通对象

       1.对象头(markword 8个字节,存在了对象的状态,被gc回收次数)
       2.classPointer指针(指向class对象)(-XX:+UseCompressedClassPointers为4个字节 不开启为8个字节)
       3.实例数据(引用类型:-XX:+UseCommpressedOops 为4个字节 不开启为8个字节)
       4.Padding对齐,8的倍数

数组对象

       1.对象头(同普通对象)
       2.classPointer指针(同上)
       3.数组长度:4个字节
       4.数组数据
       5.对齐 8的倍数

对象头具体包含什么?

   1.锁定信息:对象有没有锁定,上面2位字节(锁的标志位)(还有一位是偏向锁其实实际上应该算是三位锁标志位)
   2.gc的标记:对象被回收多少次,分代年龄
   根据对象状态进行每一位的分配

32位markWord头中信息

Object o = new Object在内存中占多少个字节?

class文件load到内存中间通过java的agent做一个中间代理,可以对calss进行操作,此处可以通过agent进行计算。
object的对象:
1.markWord头 8个字节
2.classPointer:正常来说是8个字节(但是这里还要看+UseCompressedClassPointers是否开启,如果开启则压缩为4个字节)
3.此时没有数据所以数据位置没有字节
4.对齐4个字节
所以得出结论new Object在内存中占16个字节

对象怎么定位?

当B b = new B(),此时b是怎么找到B这个对象的呢?

    1.句柄池(间接指针,b指向两个指针,一个指向真正的对象,一个指向B.Class)
    2.直接指针(一个指针直接指向真正的对象,然后这个对象里面有一个指针指向B.Class)(HotSpot使用的是这种方式)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值