深入理解Java 虚拟机(周志明)笔记(三)——Java对象在内存中的存储与访问

Java对象在内存中的存储
    1.对象存储布局
    要求:对象起始地址必须是8字节的整数倍
     1.对象头:1.存储对象自身的运行时数据(Mark Word):哈希码、GC分代年龄、锁状态标志……
                           非固定的数据结构,总长度为32/64bit
               2.类型指针:即对象指向它的元数据指针,虚拟机通过该指针确定对象是哪个类的实例
               3.若对象为数组,还必须存储数组长度。
     2.实例数据:存储对象真正的有效数据(类的各字段内容)
               存储顺序:1.相同宽度的字段被分配到一起
                         2.父类中定义的变量出现在子类之前


     3.对齐填充:1占位符,保证对象起始地址必须是8字节的整数倍(非必须存在)
2.对象的访问定位
      1.Java 对象通过栈上的引用(reference)访问相应的对象
      2.访问方式  1.句柄方式   a.在Java堆中划分一块内存做句柄池,句柄存储对象实例数据地址和类型数据地址。实例池存储对象实例数据,方法区存储对象类型数据
                               b.引用存储句柄地址
                      优点:在垃圾收集过程中进行对象移动时只需修改句柄的值,而引用的本身不需要改变。
        2.直接指针方式(Hotspot JVM采用方式)  1.Java堆中方法区存储对象类型数据,堆中存储对象实例数据和类型指针
                        2.引用存储对象地址
             优点:速度快,节省了一次指针定位的时间开销。

你可能感兴趣的:(深入理解Java 虚拟机(周志明)笔记(三)——Java对象在内存中的存储与访问)