JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(二)

③. 对象的内存布局


  • ①. 对象内部结构分为:对象头、实例数据、对齐填充(保证8个字节的倍数)


  • ②. 对象头分为对象标记(markOop)和类元信息(klassOop),类元信息存储的是指向该对象类元数据(klass)的首地址


JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(二)


①. 对象头(Header)


①. 对象标记Mark Word 默认存储 (哈希值(HashCode )、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳)等信息


这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。


它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。



JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(二)


②. 对象头多大 在64位系统中,Mark Word占了8个字节,类型指针占了8个字节,一共是16个字节


JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(二)


③. 类元信息(又叫类型指针) 对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例


②. 实例数据(Instance Data)


  • 说明:它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段) 规则:


  1. 相同宽度的字段总被分配在一起


  1. 父类中定义的变量会出现在子类之前


  1. 如果CompactFields参数为true(默认为true),子类的窄变量可能插入到父类变量的空隙


③. 对齐填充(Padding)


  • ①. 不是必须的,也没特别含义,仅仅起到占位符作用
  • ②. 解释如下图:


JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(二)




上一篇:黑客侵入电子签名供应商DocuSign的数据库 随后向用户发起钓鱼攻击


下一篇:SQL提示介绍-强制并行