类对象创建布局及访问

对象的实例化

创建对象的方式

  • new
  • clone
  • 反序列化
    • 通过文件或者网络获取对象的二进制流
  • class的newinstance
    • 反射的方式,只能调用空参
  • constructor的newinsurance
    • 反射的方式,能调用空参或有参
  • 其它第三方库

对象创建的步骤

  • 对应类是否加载、链接、初始化
  • 为对象分配内存
    • 计算对象所需空间
    • 如果内存规整则通过指针碰撞方式进行划定内存,移动指针
    • 如果内存不规整则维护空闲列表,从中找到足够大的一块使用
  • 处理并发安全问题
    • cas乐观锁
    • TLAB方式
  • 属性初始化(根据代码设置初始化值)
  • 设置对象头
  • 执行init方法(编译时字节码文件生成的针对属性和代码块的初始化方法)



对象的内存布局

  • 对象头
    • 运行时元数据(8字节):哈希值,锁标志位,gc分代年龄,线程持有的锁,偏向锁线程id,偏向时间戳
    • 类型指针(4字节):指向类元数据
    • 数组长度(4字节):如果是数组时才有
  • 实例数据
    • 存储本身字段和父类字段
    • 相同字段放在一起,父类字段放在前
    • 子类的窄变量可以插入到父类变量空隙(可以参数控制)
  • 对齐填充(保证可以被8字节整除)



对象的访问定位

通过栈桢中记录的对象引用地址来访问对象,具体有两种方式

  • 句柄访问:堆中有句柄池分别记录指向对象的指针以及指向类型的指针
    • 优点:对象移动时不需要修改栈桢中的地址
    • 缺点:单独维护句柄池
  • 直接访问:栈帧中的地址指向堆中对象,对象中记录类型指针
    • 优点:不需要额外的空间
    • 缺点:对象移动时需要修改地址



版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接,感谢各位看官!!!

本文出自:monkeyGeek

座右铭:生于忧患,死于安乐

欢迎志同道合的朋友一起交流、探讨!

monkeyGeek
# ,

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×