对象头的内部结构(new Object这个对象里面到底有什么)【图文】
1、创建了Customer()实例 和 Account()实例
2、对象头里包括:运行时元数据、类型指针、实例数据、对齐填充
(1) 运行时元数据里又包括:哈希值(HashCode)、GC分代年龄、锁状态标志
① 哈希值:它是一个地址,用于栈对堆空间中对象的引用指向,不然栈是无法找到堆中对象的
② GC分代年龄:记录幸存者区对象被GC之后的年龄age,,一般age为15之后下一次GC就会直接进入老年代
③ 锁状态标志:记录一些加锁的信息
(2)类型指针:是对方法区中类元信息的引用
(3) 实例数据:真实记录一个对象包含的数据,比如说一个person对象,里面可能包含年龄、性别、身高等等
其中数据为字符串的,要引用到字符串常量池。
想知道jdk8字符串常量池到底在那个地方存储的可以看这里。
(4)对齐填充:填充部分仅起到占位符的作用, 原因是HotSpot要求对象起始地址必须是8字节的整数,假如不是,就采用对齐填充的方式将其补齐8字节整数倍,那么为什么是8呢?原因是64位机器能被8整除的效率是最高的。
另外这个过程还会涉及到逃逸分析。我写了一篇逃逸分析的具体作用,感兴趣可以看看。
基本数据类型 | 所占字节数 | 默认值 | 包装类名称 |
---|---|---|---|
byte | 1(1字节=8位) | 0 | Byte |
short | 2 | 0 | Short |
int | 4 | 0 | Integer |
long | 8 | 0L | Long |
double | 8 | 0.0d | Double |
float | 4 | 0.0f | Float |
char | 2 | ‘\u0000’ | Character |
boolean | 1 | false | Boolean |
怎样快速记住这些类型的方法,请看这里。
有用点个关注,手留余香!???? ???? ????