java虚拟机——对象的布局、访问方式

原创 2016年08月28日 23:39:51

对象的内存布局

在上一章节中,我们讨论了对象在虚拟机中是如何创建的,那么在对象创建后,它在内存中是如何进行布局的呢?也就是说它都有哪些区域和内容呢?
对象在内存中的布局可以分为3个区域:对象头、实例数据、对齐填充(HotSpot虚拟机中是采用这种方式)。

对象头

HotSpot虚拟机中的对象的对象头分为两部分:
第一部分为:存储了对象的HashCode(哈希码)、GC分代年龄、线程持有的锁,锁状态标志等(想要了解它们其中各个具体数据结构,大家可以单独查阅,这里就不多说啦)。
第二部分为:类型指针,就是对象是属于哪个类的,对象通过这个指针来进行确定。另外,如果对象是一个数组,那么在这部分还必须有一块用来记录数组长度的数据块,因为JVM能确定普通类的实例对象的大小,但是对于数组来说,确定大小还需要知道数组的长度。

实例数据

在介绍完对象的对象头之后,接下来的区域就是实例数据了,实例数据就是对象真正存储有用数据的一部分(可以理解为咱们对象中的成员变量等 ),就是程序代码中所定义的各种类型的字段。无论是父类继承来的还是子类中新定义的,都有记录,我们可以直接在子类中使用父类的非私有成员。

对齐填充

第三个区域就是对齐填充,这部分可以并没有太大的意义,按字面的意思就是用来填充的,因为在HotSpot虚拟机中,要求对象的大小必须是8个字节的整数倍,对象中的对象头是8字节的整数倍,那么就看实例数据部分是不是8字节的整数倍。如果实例数据部分不是8字节的整数倍,那么对齐填充就发挥功能,它将会填充补全,将实例数据部分变为8字节的整数倍。

对象的访问定位

对象的访问定位是方便我们能更好的使用对象,我们在java虚拟机栈上通过reference(引用类型)来操纵对象,而reference类型只是一个指向对象的引用,但是具体的访问方式并没有定义。所以具体如何访问一个具体的对象是由不同JVM而定的。但是目前的访问方式主要有两种:句柄访问和直接指针访问。

句柄访问

使用句柄访问对象,java堆将单独划分出一块区域用来作为句柄池,reference中存储的就是对象的句柄地址,句柄中包含了指向对象实例的数据的指针和指向对象类型数据的指针。通过下面的图就可以更加形象的了解句柄是如何访问对象的。



直接指针访问

直接指针访问方式(HotSpot VM),java栈中的reference类型就会直接指向一个实例对象,对象中包括了三部分内容,哪三部分呢?就是上面说的对象的内存布局中的三个区域:对象头、实例数据、对齐填充。对象头部分包含了指向对象类型数据的指针。接下来通过图来理解。


对于这两种访问方式来说,各有千秋,句柄访问最大的好处就是reference中存储的是句柄地址,对象移动时候(在上一节我们通过讨论可知,在垃圾回收期间,不同的垃圾收集器在垃圾收集的时候可对存活的对象进行“压缩”移动),就只改变句柄中的指向对象实例数据的指针即可。
而对于直接指针访问方式来说,最大的特点就是一个字,快。访问速度快,节省了一次指针定位的时间,虽然一次的访问时间对于现在的计算机以及虚拟机来说没有多少,但是对于java这种频繁访问对象的语言来说,积少成多之后这可是一笔不小的开销成本。三大商用虚拟机之一的,也就是咱们总是在作为参照讨论的HotSpot VM就是采用直接指针访问方式。但是不同的虚拟机会采用不同的方式来进行对对象的访问,所以采用句柄访问方式也是很常见的。

java对象的访问

java对象的访问我们都知道一般访问和操作对象都是通过引用来操作和访问对象。目前对象的访问方式有句柄和直接指针:1、如果使用句柄访问的话,那么java堆中将会划分出一块内存作为句柄池,referenc...
  • LZH984294471
  • LZH984294471
  • 2016年06月24日 16:15
  • 406

java中的对象访问原理及图解

对象访问会涉及到Java栈、Java堆、方法区这三个内存区域。 如下面这句代码: [java] view plain copy  print? Obje...
  • u011130752
  • u011130752
  • 2016年03月14日 15:41
  • 1310

JVM学习笔记之对象访问的两种方式

虚拟机访问对象的两种方式
  • poxiaozhuimeng
  • poxiaozhuimeng
  • 2015年03月24日 11:56
  • 537

java虚拟机理解(二)——对象访问机制

接着说java虚拟机,对象创建结束后需要使用对象,就涉及到对对象访问的问题。虚拟机的取指指针在栈上获取对象引用后,就需要到堆上去获取对象实例。对象访问取决于虚拟机实现。主流的java虚拟机采用直接指针...
  • cai2016
  • cai2016
  • 2017年03月22日 19:52
  • 368

Java对象与JVM(三) Java对象在Java虚拟机中的引用访问方式

在前面两篇文章中了解到Java对象实例是如何在HotSpot虚拟机的Java堆中创建的,以及创建后的内存布局是怎样的。下面详细了解在Java堆中的Java对象是如何访问定位的:先来了解referenc...
  • tjiyu
  • tjiyu
  • 2016年12月29日 21:14
  • 2348

《深入理解java虚拟机》读书笔记:Java对象的内存布局

一个int类型4占4个字节的内存,一个byte一个字节。但是他们的封装类型Integer,Byte对象内存损耗还是一样的吗?并不是,而且差距十分大。     HotSpot虚拟机中,一个普通的Java...
  • bruce128
  • bruce128
  • 2016年03月30日 21:46
  • 1672

Java虚拟机 - 对象访问

对象访问会涉及到Java栈、Java堆、方法区这三个内存区域。 如下面这句代码: [java] view plaincopyprint? Object objectRef = new Obj...
  • fdhdjfkjfkjt43486
  • fdhdjfkjfkjt43486
  • 2014年03月15日 23:55
  • 356

java面板的使用与五种界面布局方式(FLowLayout、BorderLayout、GridLayout、CardLayout、BoxLayout)

             (JPanel)Panel是一个轻量级的容器,由于不是顶层的容器,故其必须放在JFrame(Frame)等高级容器上,这样就可以在一个Frame(JFrame)上通过Pane...
  • yangjingyuan
  • yangjingyuan
  • 2011年01月18日 11:01
  • 25671

Java布局方式

Java为我们提供了几个常用的布局管理器类,例如:FlowLayout、BorderLayout、GridLayout、GridBagLayout等。 java.awt FlowLayout 将...
  • zengxiantao1994
  • zengxiantao1994
  • 2016年10月28日 16:09
  • 358

对象的访问定位:句柄与直接指针

对象的访问定位:句柄与直接指针Java程序通过栈中的reference数据来操作堆上的具体对象,而对象的访问方式取决于虚拟机的实现。主流访问方式有句柄和直接指针两种句柄方式Java堆中将会划出一块内存...
  • FIRE_TRAY
  • FIRE_TRAY
  • 2016年04月28日 16:53
  • 1783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java虚拟机——对象的布局、访问方式
举报原因:
原因补充:

(最多只允许输入30个字)