对象创建概览-上帝猿视角

语言层面上,创建对象通畅仅仅是一个new搞定,在虚拟机中,过程是如何的?(不包括数组和Class对象)


虚拟机遇到一个new指令时

  • 1,检查这个指令的参数是否能在常量池中定位到一个列的符号引用
  • 2,检查这个符号引用代表的类是否已经被加载解析、和初始化过?
  • 3,如果没有,则必须先执行相应的类的加载过程
  • 4,类加载检查
  • 5,虚拟机为新生对象分配内存,该内存在类加载完成后便完全确定的
    分配内存: 指针碰撞、空闲列表
 - 划分内存,并发情况下的线程安全问题:
        1. 虚拟机采用CAS配上失败重试,保证更新操作的完整性
        2. 把内存分配的动作按照线程划分在不同的空间中进行:TLAB
              虚拟机是否使用TLAB : 通过设置=XX:+/ -UseTLAB  设定 

内存分配好之后,虚拟机将分配的内存全部初始化为零值(不包括对象头)如果使用TLAB,这个工作过程提前到TLAB分配时进行,保证对象在不赋初始值的时候就有一个默认值,程序可以访问这些数据类型对应的零值


  • 6 接下来对对象进行必要的设置,对象所属的类,元数据信息地址,对象的哈希码,GC分代年龄等,这些信息存放在对象头中,虚拟机的状态会影响对象头的内容。

从jvm角度看:至此,对象创建完成
从java程序角度看,对象创建才刚刚开始,对象的数据都是零值,接着执行 方法,按照上帝猿的意愿进行初始化,这个时候对象才真正创建完成。

你可能感兴趣的:(对象创建概览-上帝猿视角)