jvm-对象创建流程

87 阅读2分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

对象

对像创建流程

1.遇到new 指令,会检查该类是否被加载过,如果没有,就执行类加载过程

2.为新生对象分配内存,在类加载后便可完全确立,在堆中划分出一块内存块,将内存空间初始化为(默认初始值)。

  • 指针碰撞”:如果堆时规整的,指针挪动内存大小的偏移量。

    • 规整:由垃圾收集器是否带有空间压缩整理。所有被使用的内存放在一边,未被使用的放在另一边,中间由一个指针规定界线。
  • 空闲列表:不是规整的,从列表中找到一块足够大的空间划给对象实例。

    • 列表:虚拟机维护一个列表,用于记录那些内存时可用的。
  • 新建内存的并发问题:一块内存分配两个对象

    • 1.采用CAS+失败重试的方式保证修改的原子性。
    • 2.为每个线程预先分配一块内存

3.对对象进行必要的设置,如 属于哪个类,如何找到类的元数据信息等,存放在对象的对象头中。

4.执行()方法对对象进行初始化(构造方法);

对象的内存布局

1.对象头

由两个部分组成:

  • markWord :存储对象自身的运行时数据:哈希码,GC分代年龄,锁状态标志等。
  • 类型指针:对象指向它的类型元数据的指针,通过它来确定是哪个类的实例。

2.实例数据

对象真正存储的有效信息:各种类型的字段内容。

对齐填充

起到占位符的作用。对象头一定时8字节的倍数,实例数据不一定是,需要通过对齐填充达到8字节的倍数。

访问定位

当创建了对象之后,如何去使用该对象

对象存放在堆中,栈种存放reference地址中,有2种访问方式

  • 1.句柄访问:堆中划分出一块内存来作为句柄池,reference存放对象的句柄地址,句柄中存放对象实例数据地址(堆种)和类型数据地址(方法区中)

    • 稳定:reference存放的句柄地址不会改变,当移动对象时,只改变句柄中的地址信息
  • 2.直接指针:reference直接存放对象的地址信息。

    • 快速:不需要经过句柄,直接访问对象。HotSpot主要使用这种方式