大家好,欢迎来到IT知识分享网。
一、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对象在堆中的体现。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/33112.html