https://www.cnblogs.com/duanxz/p/4967042.html
参考链接中详细的讲解了java对象在内存中的布局。
补充知识点
在堆中分配对象内存的方式:
指针碰撞
假设java堆中内存是绝对规整的,所有用过的内存放一边,未使用过的放一边,中间有一个指针作为临界点,如果新创建了一个对象则是把指针往未分配的内存挪动与对象内存大小相同距离,这个称为指针碰撞。
空闲列表
如果java堆中的内存分配不是规整的,虚拟机就会维护一个空间列表,用来记录剩余的可用的内存空间。每次为变量分配内存后动态的去维护这个列表。