Java虚拟机类型众多,本文以主流vm之一HotSpot为例来说说Java的对象结构,在内存中用三块区域用于存储对象,分别是对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。图为普通对象实例结构,数组类型对象的话,对象头部分还包含数组长度信息。
对象头
在HotSpot中,对象头包含两部分信息,分别是markword和klass(数组另有长度信息),第一部分则主要存储对象运行时数据,如哈希值(HashCode)、垃圾回收年代、锁状态标志等信息。这部分数据长度取决于当前虚拟机的位数,64位和32位的分别是64bit和32bit。而对象头的另一部分信息是klass类型指针,用于虚拟机对对象的寻址访问,寻址方式一般是两种,其一是通过句柄,先访问句柄池,再从句柄池中取得对象真实地址,从而访问对象;其二是直接指针(HotSpot采用的),即直接访问到对象。
实例数据
实例数据才是对象在内存中的真正有效信息,也是代码中所定义的各类型内容。
对齐填充
这部分也不是必须存在的,亦无特殊含义,仅仅起着占位符的作用,因为在HotSpot中对象的大小必须是8字节的整数倍,而对象头是规定好了的,正好是整数倍,只有实例数据部分是变长数据,因此当实例数据部分不够长度时就需要通过对齐填充来补齐。