对象到底是怎么new出来的

前言:要想理解本文,必须先了解JVM的内存结构

一.创建对象的方式
  • new:最常见
  • 反射:Class.newInstance()
  • 使用clone()
  • 反序列化
二.创建对象的步骤(对象在JVM中怎么存储?)
  1. 判断对象的类是否加载,没加载进行加载
  2. 为对象分配内存空间
    • 内存规整:采用指针碰撞,指针就是空闲内存和使用过的内存的一个分界点,每次有新的对象,指针就向后移动相应大小的内存空间。(内存规整说明采用复制算法/标记压缩算法)
    • 内存不规则:空闲列表:JVM维护一个空闲列表,记录哪些内存块可用,有新的对象进入时,,从空闲链表中找到空闲的位置进行分配。
    • 说明:采用哪种方式完全取决于垃圾回收器是否使用内存整理的算法
  3. 处理并发的问题:使用TLAB或者CAS保证原子性
  4. 初始化分配到的空间:给所有的属性赋初始值
  5. 设置对象头
  6. 执行init方法:执行代码层面的构造器,完成初始化。 
三.对象的内存布局

对象到底是怎么new出来的

下图展示了一个对象分配的全过程:

对象到底是怎么new出来的

四.对象的访问定位:

创建对象的目的就是为了使用它,那么JVM是如何通过栈帧中的对象引用访问到其内部的对象实例呢?有2种方式:

句柄访问 对象到底是怎么new出来的 直接指针:Hotspot采用

对象到底是怎么new出来的

 

 寄语:行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。

上一篇:类加载机制


下一篇:JVM的垃圾回收机制