一、对象的实例化

1.1、判断对象所属于的类是否被加载、链接、初始化
虚拟机需要一条new 指令后,首先去检测这个指令的参数能否在Metaspace的常量池中
定位到一个类的的符号引用,并且去检测这个符号引用代表的类是否被加载、链接、初始化(即判断类元信息是否存在)。
如果没有,则在双亲委派机制下,使用当前类的加载器以ClassLoader+包名+类名为key进行查找对应的.class文件。
如果没有找到此文件,则抛出ClassNotFoundEx异常,如果找到,则加载,生成类的对象
1.2.、为对象分配内存
如果内存规整,则发生指针碰撞,挨个位置找,找到空闲位置,插入。
如果内存不规整,虚拟机需要维护一个列表(Free List),记录着哪块内存没有被用到,
然后找到一块足够大的内存,放进去,更新这个 空闲列表(Free Lsit)

1.3、处理并发安全问题
1.采用CAS(对比和交换)失败重试、区域加锁、保证更新的原子性
2.每个线程预先分配TLAB块(私有块儿,避免并发)。
1.4、初始化分配到的空间
1.属性的默认初始化
2.显示初始化
3.代码块的初始化
4.构造器当中初始化
1.5、设置对象头
将对象的所属的类(即类的类元信息)、对象的HashCode和对象的GC信息、锁信息等存储
在对象的对象头中,这个过程具体实现方式 取决于JVM实现
1.6、执行init方法进行初始化
略...
对上述总结:
1.加载类元信息
2.为对象分配内存
3.处理并发问题
4.属性的默认初始化
5.设置对象头信息
6.属性的显示初始化、代码块中的初始化、构造器中的初始化
二、对象的内存布局

...

三、对象的访问定位
句柄访问
开辟 一块 句柄池表 内存
直接指针 指向(咱们用的)
相比 句柄访问比直接指针 多了一个 中间件
四、面试题
