对象的创建
对象的创建方式:
- 直接new
- class的newInstance,通过类反射
- Constructor的newInstance(),通过反射构造器创建
- 使用clone(),浅复制实现
- 反序列化
- 第三方库Objnesis
对象的创建步骤:
-
检查这个符号引用代表的类是否已被加载,解析,初始化
先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,检查这个符号引用代表的类是否已被加载,解析,初始化。如果没有,则必须先执行对应的类加载过程。 -
为新生对象分配内存
-----假如java堆中的内存是绝对规整的,(使用过的内存放一边,没使用过的放另外一边,中间有一个指针作为分界指示器)分配内存就是把指针从向空闲内存一方挪动对象大小的距离。称之为“指针碰撞”。-----假如java堆中的大小不规整,虚拟机就必须维护一个列表,记录下内存可用信息,在分配内存时把适应大小的内存分给对象后,并更新列表上的记录,这种分配方式为“空闲列表”。
-
处理并发问题
并发情况下,修改指针指向并不是线程安全的,有以下2种解决方案:
- 对分配内存空间的动作进行同步处理,实际上虚拟机是采用CAS配上失败重试的方式保证更新操作的原子性
- 把内存分配的动作按照线程划分在不同的空间中进行,即每个线程在java堆中预先分配一块小内存,称作本地线程分配缓冲(TLAB),线程要分配内存,就在线程的本地缓冲区分配,只有本地缓冲区分配完了,分配新的缓冲区时才需要同步锁定。
-
初始化分配的空间
所有属性设置默认值,保证对象实例字段在不赋值时能直接使用 -
设置对象头
包含运行时元数据类型指针 -
执行init方法进行初始化