Java 对象模型(OOP-Klass模型)

一、Java 对象模型(对象头、实例数据和对齐填充 jdk1.6

     对象在内存中的布局分为三块区域:对象头(Mark Word、元数据指针和数组长度)、实例数据和对齐填充。

   

 

  实例对象如何存储:对象的实例存储在堆中,对象的元数据存储在元空间区,对象的引用存储在栈中。

1. Java对象头

    对象头Java对象头一般占有2个机器码(在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中,1个机器码是8个字节,也就是64bit),但是 如果对象是数组类型,则需要3个机器码,因为JVM虚拟机可以通过Java对象的元数据信息确定Java对象的大小,但是无法从数组的元数据来确认数组的大小,所以用一块来记录数组长度。

   

 1.1 Mark Word

   

  1.2 类型指针(又叫元数据指针):它主要指向类的数据,也就是指向方法区中的位置,通过这个指针,我们就可以知道该实例属于哪个类,长度通常为32bit。

  1.3 数组长度:只有数组对象才有,在32位或者64位JVM中,长度都是32bit。

 2. 实例数据:存放类的属性数据信息,包括父类的属性信息。

 3. 对齐填充:由于虚拟机要求 对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。

二、Java两种对象访问方式

 1.句柄在 Java 堆中会独立创建一个句柄池,引用指向句柄,而句柄指向实例数据和类型数据。稳定,访问速度慢。

    

     使用这种方式来访问的优点是稳定,例如在 GC 后,实例数据需要移动,那么只需要修改句柄池中的内容即可,reference 指向的是稳定的位置,缺点是这种方式需要二次定位,速度较慢。

 2. 直接指针(HotSpot虚拟机):引用直接堆中对象地址,堆中保存了实例数据和类型数据指针,指针直接指向另外存储的类型数据。不稳定,访问速度快。

     

    使用这种方式的优点是访问实例数据快,因为 reference 指向直接的对象,省去了一次内存定位开销。但缺点就是不够稳定,在对象移动后,reference 也需要修改值。

三、Java对象模型面试问题

  1.Java对象模型是Java对象在堆中的体现。

   

 

posted @ 2022-08-19 18:20  遇见神龙  阅读(847)  评论(0编辑  收藏  举报