对象创建的过程

混江龙づ霸主 提交于 2020-04-06 06:21:24
  1. 通过符号引用定位到类是否被加载。没有就加载类。执行类加载与验证的过程

  2. 分配内存:类的准备阶段。类加载完成后就能确定对象分配多少内存。如果虚拟机具有Compact压缩功能(标记整理),就是用指针碰撞(记录头尾位置);如果只有标记清理的虚拟机,就是用空闲列表

  3. 分配内存的方式:CASTLAB两种。如果多线程并发创建,需要考虑同步问题(多个对象指向一个地方)。

  • CAS:一般使用CAS和失败重试保证原子性。

  • TLAB:按照线程分配不同空间(本地线程分配缓冲),只有TLAB用完,需要分配新的才需要同步。是否使用该方式通过参数指定

  1. 解析,符号引用替代成直接引用

  2. 初始化

  • 分配到的内存初始化为零(除了对象头)。这就是对象属性不需要初始化可以直接使用

  • 设置对象头:什么类的对象,元数据,哈希码,对象GC分代年龄等信息。根据虚拟机运行状态,判断是否启用偏向锁

  • 执行初始化方法:<init>。按照程序员指定的初始化过程初始化对象。这里就是执行初始化的过程

    • 父类的静态初始化块
    • 本类的静态初始化块
    • 父类的初始化块
    • 父类的构造方法
    • 本类初始化块
    • 本类的构造方法
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!