对象的实例化
对象创建的方式
① new
② 反射 Class 的 newInstance() 以及 Constructor的newInstance(XXX)
③ 使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone()
④ 使用反序列化,从文件中,网络中获取一个对象的二进制流
⑤ 第三方库Objenesis
创建对象的步骤
1.判断对象对应的类是否加载,链接,初始化
2.为对象分配内存
如果内存规整,使用指针碰撞的方式分配
如果内存不规整,虚拟机需要维护一个列表,分配列表中空闲的内存
3.处理并发安全问题
采用CAS失败重试,区域加锁保证更新的原子性
每个线程预先分配一个TLAB
4.初始化分配到的空间,所有属性设置默认值,保证对象实例在不赋值时可以直接使用
5.设置对象的对象头,将对象的所属类,对象的HashCode,对象的GC信息,锁信息等储存在对象头中
6.执行init方法进行初始化,初始化成员变量,执行实例代码块,调用构造方法,并把堆内的首地址赋值给引用变量。
内存布局
对象的访问定位
通过栈上的局部变量表的引用访问
访问方式有两种:
一、句柄访问
二、直接指针(Hotspot)