对象在内存中的布局
对象的创建
1.1 给对象分配内存
- 给内存分配的方法
- 指针碰撞
- 空参列表
- 选择内存的分配方式是由java的堆是否规整来决定的,而堆是否规整是有垃圾回收机制决定的,取决于它是否有压缩整理的功能。
- 线程安全性问题
- 高并发下可能会出现创建问题
- 线程同步
- 本地线程分配缓冲
- 初始化对象
- 在堆内存里面对象已经存在
- 执行构造方法
1.执行完构造方法对于开发者来说,对象才真正的创建好。
1.2 深入了解对象
- Header(对象头)
- 自身的运行时数据(mark word)
- 哈希值
- GC分代年龄(为了GC的分代收集算法服务)
- 锁状态标志
- 线程持有的锁
- 偏向线程ID
- 偏向时间戳
- HotSpot虚拟机对象头 Mark Word
- 类型指针
即是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。 - 数组长度(1字宽):记录数组长度,如果当前对象是数组
- 自身的运行时数据(mark word)
- InstanceData(实例数据),我所看到对象就是这一部分。
- 相同宽度的字段都会分配到一块 如Longs 和 doubles 、shorts/chars
- 在父类定义变量可能会出现在子类之前。
- 实例中真实有效的信息。
- Padding(对齐填充)
- 因为HotSpot JVM要求java的对象占的内存大小应该是8bit的倍数,所以后面有几个字节用于把对象的大小补齐至8bit的倍数,没有特别的功能。
1.3 对象的访问定位方法
- 使用句柄
- 直接指针
这里有详解好和对比 https://www.cnblogs.com/lonecloud/p/7512034.html