对象实例化
1、对象创建方式
- new
- Class的newInstance
- constructor的newInstance
- clone()
- 反序列化
1,2,3会调用构造方法,4,5不会调用构造方法
2、创建对象的步骤
- 判断对象对应的类是否被加载,链接,初始化
- 为对象分配内存空间(如果内存堆规整----指针碰撞方法,如果内存堆不完整-空闲列表法),内存堆是否完整是根据垃圾回收算法和垃圾收集器决定的
- 处理并非安全问题(堆是线程共享的,线程安全问题)解决方案: 1、CAS失败重试保证原子性 2、TLAB 每一个线程预先分配一块区域
- 初始化分配到的空间
- 设置对象头信息
- 执行init方法初始化
3、 对象的内存布局
对象头+实例数据+填充数据
- 对象头= MarkWord (hashcode,gc年龄,锁的状态,线程id) 、Class point
- 实例数据
- 填充信息(必须是8的倍数,方便寻址)
4、对象的访问地址
直接指针
栈的引用直接指向堆的对象的地址
句柄访问
栈的引用指向堆中的句柄池引用,句柄池引用指向堆的对象地址
直接引用相对较快,只要改变栈中的引用,句柄池不需要,只要改变句柄池中的引用对象地址