Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(三)
2017-05-10 00:44
330 查看
本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的定位访问。
在java中我们无时无刻不在创建对象,我们创建对象的目的当然是为了使用它了。但是我们怎么才能使用操作创建的对象呢?我们的java程序会通过栈上的reference数据(指向对象的引用)来操作堆上的具体对象。那这个对象的引用是通过什么方式去定位、访问堆中的对象的具体位置呢?目前主流的访问方式大概有以下两种:使用句柄和直接指针两种方式。
![](http://img.blog.csdn.net/20170510001421758?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemtueHg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20170510003845849?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemtueHg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
使用句柄访问对象的最大好处是reference中存储的是稳定的句柄地址,在对象被移动(比如垃圾回收的时候)时只会改变句柄中实例数据的指针。使用直接指针访问的最大好处是速度快,因为它节省了一次指针定位的时间开销(如上图所示).在HotSpot虚拟机中它是采用直接指针来进行对象的访问的。
在java中我们无时无刻不在创建对象,我们创建对象的目的当然是为了使用它了。但是我们怎么才能使用操作创建的对象呢?我们的java程序会通过栈上的reference数据(指向对象的引用)来操作堆上的具体对象。那这个对象的引用是通过什么方式去定位、访问堆中的对象的具体位置呢?目前主流的访问方式大概有以下两种:使用句柄和直接指针两种方式。
使用句柄:
如果是使用句柄的方式访问对象的话,就需要在java堆中划出一块内存作为句柄池,而reference(对象引用)中存储的就是对象的句柄地址。在这个句柄中包含了对象实例数据类型与类型数据各自的具体地址信息。如下图所示(仔细观察本地变量表中的东西看看有什么发现):直接指针
如果使用指针访问,那么堆对象的布局就必须考虑如何放置访问类型数据的相关信息,而reference中存储的就是对象的地址。如下图所示:使用句柄访问对象的最大好处是reference中存储的是稳定的句柄地址,在对象被移动(比如垃圾回收的时候)时只会改变句柄中实例数据的指针。使用直接指针访问的最大好处是速度快,因为它节省了一次指针定位的时间开销(如上图所示).在HotSpot虚拟机中它是采用直接指针来进行对象的访问的。
相关文章推荐
- Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)
- Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(一)
- HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程
- hotspot虚拟机中java对象的分配与布局和访问
- hotspot虚拟机在java堆中对象分配布局和访问的全过程
- HotSpot 虚拟机在 Java 堆中对象是如何创建、如何布局以及如何访问的?
- Java虚拟机堆内存中对象的分配、布局、访问 -----以HotSpot虚拟机为例
- 深度理解java虚拟机读书笔记(二)HotSpot Java对象创建,内存布局以及访问方式
- 深入理解Java虚拟机之对象的创建-内存布局-访问定位
- Java对象在HotSpot虚拟机的创建、内存分布和访问
- 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式
- HotSpot虚拟机在堆中对对象分配、布局和访问的全过程
- Hotspot虚拟机--对象分配,内存布局,访问定位
- 深入分析虚拟机在Java堆中对象分配、布局和访问的全过程
- Java堆中对象创建、布局、访问全过程
- Java内存区域、内存溢出异常和对象创建、布局、访问全过程
- Java对象创建的过程及对象的内存布局与访问定位
- Java对象的创建、内存布局、访问定位
- 基础回顾——Java对象创建、内存分配、访问定位概述
- Java虚拟机(HotSpot)-对象:创建、内存布局、访问定位