Java虚拟机类型众多,本文以主流vm之一HotSpot为例来说说Java的对象结构,在内存中用三块区域用于存储对象,分别是对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。图为普通对象实例结构,数组类型对象的话,对象头部分还包含数组长度信息。

Java对象结构杂谈

对象头

    在HotSpot中,对象头包含两部分信息,分别是markword和klass(数组另有长度信息),第一部分则主要存储对象运行时数据,如哈希值(HashCode)、垃圾回收年代、锁状态标志等信息。这部分数据长度取决于当前虚拟机的位数,64位和32位的分别是64bit和32bit。而对象头的另一部分信息是klass类型指针,用于虚拟机对对象的寻址访问,寻址方式一般是两种,其一是通过句柄,先访问句柄池,再从句柄池中取得对象真实地址,从而访问对象;其二是直接指针(HotSpot采用的),即直接访问到对象。

实例数据

    实例数据才是对象在内存中的真正有效信息,也是代码中所定义的各类型内容。

对齐填充

    这部分也不是必须存在的,亦无特殊含义,仅仅起着占位符的作用,因为在HotSpot中对象的大小必须是8字节的整数倍,而对象头是规定好了的,正好是整数倍,只有实例数据部分是变长数据,因此当实例数据部分不够长度时就需要通过对齐填充来补齐。

 

相关文章:

  • 2021-08-30
  • 2021-11-07
  • 2021-04-06
  • 2021-10-06
  • 2022-01-26
  • 2021-10-16
猜你喜欢
  • 2021-04-23
  • 2021-04-18
  • 2021-12-30
  • 2021-07-27
相关资源
相似解决方案