对象的创建
- class loading
- class linking( verification, preparation, resolution)
- class initialization
- 申请对象内存空间
- 成员对象赋初始值(内存填充0)
- 调用构造方法
- 成员变量按顺序赋予初值
- 执行构造方法
对象组成及大小(64位虚拟机)
普通对象
-
对象头:markword 占8个字节
- 记录对象自身运行时的数据,如:HashCode、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、GC分代年龄等。
- GC分代年龄占4个bit,最大15,默认GC年龄加到15时(-XX:MaxTenuringThreshold可调节),JVM会将新生代对象移动到老年区
-
image.png
-
ClassPointer指针:-XX:+UseCompressedClassPointers 为4字节 不开启为8字节
-
实例数据
- 引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节
Oops: Ordinary Object Pointers - 基本类型 boolean,byte,short,int,long,char, float,double
- 引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节
-
Padding对齐,8的倍数
数组对象
- 对象头:markword 占8个字节
- ClassPointer指针同上
- 数组长度:4字节
- 数组数据
- Padding对齐,8的倍数
对象访问方式
- 句柄池 :reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。
-
直接指针:快,相比句柄池节省了一次指针定位的时间开销
image.png










网友评论