Java中创建对象的方式
new -通过调用构造器来初始化实例字段
反射-通过调用构造器来初始化实例字段
Object.clone-通过直接复制已有的数据,来初始化新建对象的实例字段
反序列化-通过直接复制已有的数据,来初始化新建对象的实例字段
Unsafe.allocateInstance-没有初始化对象的实例字段
Java对象的空间占用
通过new创建的对象,涵盖了它所有父类中的对象实例的字段
对象头,由标记字段和类型指针构成
标记字段,用于存储Java虚拟机有关该对象的运行数据,比如:哈希码、GC信息、锁信息等
类型指针,用于指向该对象的类
此对象的实例字段对应的内存空间
压缩指针
JVM的内存空间有限且昂贵,为了减少类型指针的内存占用,将64位指针压缩至32位,进而节约内存。之前64位寻址,寻的是字节。现在32位寻址,寻的是变量。再加上内存对齐(补齐为8的倍数),可以每次寻变量都以一定的规则寻找,并且一定可以找得到。
内存对齐
内存对齐的另一个好处是,使得CPU缓存行可以更好的实施。保证每个变量都只出现在一条缓存行中,不会出现跨行缓存。提高程序的执行效率。
字段重排
其实就是更好的执行内存对齐标准,会调整字段在内存中的分布,达到方便寻址和节省空间的目的。
@Contented注解
该注解就是用来解决虚共享问题的,被该注解标识的变量,会独占一个CPU缓存行。但也因此浪费了大量的内存空间。
网友评论