9.对象的实例化、内存分配与访问定位

一、对象的实例化

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.属性的显示初始化、代码块中的初始化、构造器中的初始化

二、对象的内存布局

...

三、对象的访问定位

句柄访问

开辟 一块 句柄池表 内存

直接指针 指向(咱们用的)

相比 句柄访问比直接指针 多了一个 中间件

四、面试题

posted @ 2021-07-08 16:06  宋佳强  阅读(95)  评论(0)    收藏  举报