Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(三)
本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的定位访问。
在java中我们无时无刻不在创建对象,我们创建对象的目的当然是为了使用它了。但是我们怎么才能使用操作创建的对象呢?我们的java程序会通过栈上的reference数据(指向对象的引用)来操作堆上的具体对象。那这个对象的引用是通过什么方式去定位、访问堆中的对象的具体位置呢?目前主流的访问方式大概有以下两种:使用句柄和直接指针两种方式。
使用句柄:
如果是使用句柄的方式访问对象的话,就需要在java堆中划出一块内存作为句柄池,而reference(对象引用)中存储的就是对象的句柄地址。在这个句柄中包含了对象实例数据类型与类型数据各自的具体地址信息。如下图所示(仔细观察本地变量表中的东西看看有什么发现):
直接指针
如果使用指针访问,那么堆对象的布局就必须考虑如何放置访问类型数据的相关信息,而reference中存储的就是对象的地址。如下图所示:
使用句柄访问对象的最大好处是reference中存储的是稳定的句柄地址,在对象被移动(比如垃圾回收的时候)时只会改变句柄中实例数据的指针。使用直接指针访问的最大好处是速度快,因为它节省了一次指针定位的时间开销(如上图所示).在HotSpot虚拟机中它是采用直接指针来进行对象的访问的。