以HotSpot虚拟机为例,对象在内存中可以分为三块区域:对象头、实例数据和对齐填充。其中,对象头包含Mark Word和类型指针,关于对象头的内容,在gitchat中对其实现和原理都已经结合openjdk源码进行了详细的说明,其也不是本博文的主题,这里就不细说了;实例数据部分则是对象真正存储的有效信息,包含代码中所定义的字段内容;对齐填充则不是必须存在的,只是起占位符的作用,比如Hot Spot虚拟机要求对象大小必须是8字节的整数倍,而对象头刚好是8字节的倍数,所以当对象的实例数据没有对齐时,就需要通过对齐填充来补全。
注:关于类型指针,虚拟机可以通过这个它来确认该对象的元数据信息,比如它属于哪个类的实例。但是我们要注意,并不是所有的虚拟机都必须以这种方式来确定对象的元数据信息。对象的访问定位一般有句柄和直接指针两种,如果使用句柄的话,那么对象的元数据信息可以直接包含在句柄中(当然也包括对象实例数据的地址信息),也就没必要将这些元数据和实例数据存储在一起了。至于实例数据和对齐填充,这里暂不做讨论。
一个对象字段既包括自身定义的,也包括从父类继承下来的,这些字段会按照顺序存储下来。而具体的存储顺序会受到虚拟机分配策略参数和字段在