[JVM]: JAVA对象创建过程

JAVA对象创建过程

在语言层面上,创建对象List list = new ArrayList<>(),在虚拟机层面上,遇到一条字节码new指令时,创建对象的过程主要分为如下几个步骤:

  1. 检查指令的参数是否能在常量池中定位到一个类的符号引用,检查这个符号引用代表的类是否已经被加载、解析和初始化。

    如未加载,则执行类加载过程:


    类加载过程
  1. 类检查通过,为新生对象分配内存

    • 堆中内存绝对规整 -> “指针碰撞
      • 将指针向内存空闲方向挪动一段与对象大小相同的距离
    • 堆中内存并不规整 -> “空闲列表
      • 由虚拟机维护列表记录哪些内存块可用
    • 由Java堆是否规整决定,决定堆规整又由GC器是否带有空间压缩整理的能力决定
      • 带有压缩整理过程的收集器 -> 指针碰撞 -> Serial, ParNew
      • 基于清除算法的收集器 -> 空闲列表 -> CMS
    • 保证并发环境下内存分配的线程安全
      • 对分配内存空间的动作进行同步处理 -> CAS+失败重试
      • 把内存分配的动作按照线程划分在不同的空间之中进行 -> 本地线程分配缓冲TLAB
  2. 将分配到的内存空间(不包括对象头)初始化为零值

  3. 对对象进行必要的设置,将信息存放在对象的对象头中

    • 对象所属类实例
    • 类元数据信息获取方式
    • 对象哈希码
    • 对象GC分代年龄
    • ……
  4. 调用Class文件中的()方法

你可能感兴趣的:([JVM]: JAVA对象创建过程)