Java语言规范和Java虚拟机规范均未指定答案,因为这是实现细节。 实际上,JVMS§2.7特别指出:
对象的表示
Java虚拟机不要求对象具有任何特定的内部结构。
从理论上讲,一致的虚拟机可以使用一组位标志来标记哪些字段已设置为非默认值,从而实现具有很多字段的对象。 最初没有分配任何字段,标志位全为0,对象很小。 第一次设置字段时,相应的标志位将设置为1,并且将调整对象的大小以为其留出空间。 [垃圾收集器已经提供了暂时暂停运行代码的必要机制,以便在堆周围重新定位活动对象,这对于调整它们的大小是必要的。
实际上,这不是一个好主意,因为即使它节省了内存,它也是复杂且缓慢的。 访问字段将需要临时锁定对象,以防止由于多线程而损坏; 然后读取当前标志位; 如果该字段存在,则对设置的位进行计数,以计算所需字段相对于对象底部的当前偏移量; 然后阅读该领域; 最后解锁对象。
因此,没有通用的Java虚拟机可以做这样的事情。 一些具有大量字段的对象可能会从中受益,但即使它们不能依赖它,因为它们可能需要在不这样做的普通虚拟机上运行。
在对象首次实例化时为所有字段分配空间的平面布局既简单又快速,因此这是标准配置。 程序员假定对象是通过这种方式分配的,因此可以相应地设计其程序,以最好地利用它。 同样,虚拟机设计人员会进行优化以加快使用速度。
最终,字段的平面布局是一种惯例,而不是规则,尽管您仍然可以依靠它。