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  宋佳强  阅读(72)  评论(0)    收藏  举报