对象创建过程、对象的内存布局、对象访问定位
对象的创建过程
1. 对象所属类的加载
首先检查对象所属类及其父类是否被类加载器加载到方法区,如果没有加载则涉及到类的加载,这里类加载还涉及到双亲委派机制
类加载过程、双亲委派机制可以参考我同分类下“深入理解JVM第一章”
2. 为对象在堆空间存储分配空间
这里又涉及到两个情况:
- 内存规整:如果内存是规整的,那么虚拟机采用的是指针碰撞法来为对象分配内存。所谓指针碰撞法就是记录当前内存中存储的数据的末尾位置,如果新数据进来则从这个位置开始继续存储,然后指针更新定位到新数据存储的末尾位置。
- 内存不规整:如果内存是不规整的,则虚拟机会维护一个空闲列表,列表里记录了哪些内存是空闲的,新数据需要存储的时候会去空闲列表找一个可用的内存。
ps:内存是否规整取决于采用的GC算法是否具有标记整理的功能。
3. 处理并发安全问题
- 采用CAS失败重试、区域加锁保证更新的原子性
- 每个线程预先分配一块TLAB
4. 初始化分配到的空间
初始化对象属性的默认初始值
5. 设置对象的对象头
下面介绍内存布局会具体介绍对象头
6. 执行init方法初始化
给属性显式初始化赋值
对象的内存布局
1. 对象头
2. 实例数据
实例数据是对象存储的真正的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承的字段)
3. 对齐填充
起到占位符的作用,比如定义一个盒子,这个盒子放这个对象的所有信息,然后没放完的地址,进行填充。
对象的访问定位
创建一个对象是为了引用它,那么如何引用呢?
两种方式:
-
句柄访问
-
直接指针
ps:hotspot采用的是直接指针的方式
觉得不错记的点个赞,谢谢!