Java虚拟机 - 创建对象

Java虚拟机 - 创建对象

Scroll Down

对象的创建

重点:

  • 首先遇到new指令会检查这个指令的参数能不能在常量池中定位到一个类的符号引用(我的理解是创建一个类实例的前提是已经保证这个类已经加载到常量池中),检查这个符号引用是否被加载、解析、和初始化,如果没有,那必须先执行相应的类加载过程 -> 为新生对象分配内存

例如下图:创建一个类,那么我们可以看到在编译好的class文件,通过jclasslib插件解析该文件,我们发现这个类中的信息存放在这些常量池中,所以在new之前才会去常量池中定位类的符号引用

WX20200601-124454

  • 对象分配多大的内存在类加载完成后就可以确定
  • 指针碰撞、空闲列表使用哪一种内存分配策略基于垃圾收集器是否带有空间压缩整理的能力决定,Serial、Parview(具有Compact)而CMS(基于Sweep清除算法)
  • CAS+失败重试(cmpxchg是下X86的CAS指令,通过CAS方式分配内存,并发失败的话转到retry中重试直到成功分配)保证内存更新操作的原子性另一种方案是TLAB
  • 内存空间必须初始化为零值
  • 是否启用偏向锁设置对象头信息(数据的元数据信息、哈希码、对象的GC分代年龄)
  • new指令之后会执行init<>()方法

image-20200601220636652

总结

了解虚拟机中new一个对象实例的流程