参考《深入理解Java虚拟机》
1 场景
java创建好对象后,访问对象的时候,java程序需要通过栈上
的reference引用
来操作堆上
的具体对象
。
JVM规范未规定对象的访问方式
,对象的访问方式由虚拟机决定
。
2 版本
JDK:1.8
虚拟机:hotspot
3 说明
主流的对象访问方式有:句柄
和直接指针
两种。
普遍使用的Hot Spot
虚拟机,使用的是直接指针
的方式。
3.1 句柄
java堆
中划分一块内存作为句柄池
,reference
中存储的是句柄的地址
。
句柄中包含了“对象实例数据
”和“类型数据
”各自的具体地址
。
3.1.1 图示
1613310832641.png3.1.2 特点
- 优点
reference
中存储的是稳定不变
的句柄地址。
当进行垃圾回收的时候,如果对象被移动
(内存地址发生变动),只需要更改堆中句柄池
中句柄
的地址,栈上
的reference本身不需要进行更改。
- 缺点
通过reference访问句柄池中的句柄
,需要一次指针定位;访问对象实例数据
,需要一次指针定位;访问对象类型数据
,需要一次指针定位。
每次访问一个对象,需要进行三次
指针定位。
3.2 直接指针
reference
中存储的是对象的地址
,对象实例数据中
存储类型的指针地址
。
3.2.1 图示
1613310514398.png3.2.2 特点
- 优点
通过栈上reference
访问句柄池中的句柄
,需要一次指针定位;访问对象类型数据
,需要一次指针定位。每次访问一个
对象,需要进行两次
指针定位。
和句柄
的方式比,最大的好处是速度快
,reference
直接存储的是对象实例数据
的地址,节省了一次对象实例指针定位
的时间开销。
因为对象的访问
在Java中非常频繁
,这类开销多了后是非常可观的执行成本。
- 缺点
进行GC回收
的时候,对象存储位置
如果在堆上发生变动
,栈上reference
上的地址将发生变动。
网友评论