创建对象的几种方式:
- new语句(调用构造器来初始化实例字段)
- 反射机制(调用构造器来初始化实例字段)
- Object.clone方法(复制已有的数据,来初始化新建对象的实例字段)
- 反序列化(复制已有的数据,来初始化新建对象的实例字段)
- Unsafe.allocateInstance(不进行实例字段初始化)
构造函数的调用:
构造函数的调用要做为构造器的低一条语句,目的是初始化继承而来的父类字段
- 隐式调用:父类存在无参构造函数,子类隐式调用父类构造器
- 显示调用:
- 父类不存在无参构造函数,子类显式调用父类构造器(super)
- 调用同类其他构造函数(this)
压缩指针
JVM引入了压缩指针的概念,将原本的64位指针压缩为32位。
64位JVM中,一个Java对象在内存中的额外开销
是16字节(对象头标记字段64位,类型指针64位)
eg Integer类型,它仅有一个int类型的私有字段,占4个字节,该类对象的额外内存开销是真正内存开销的4倍(这也是为啥Java引入基本类型的原因之一)
64为JVM通过引入压缩指针来进行对象指针的压缩(64位压缩为32位,对象头大小从16字节降至12字节(类型指针被压缩为32位,对象头标记字段仍然是64位))
字段重排列
概念:JVM重新分配字段的先后顺序,以达到内存对齐的目的