java对象的访问定位

作者: 水煮鱼又失败了 | 来源:发表于2021-02-14 22:12 被阅读0次

参考《深入理解Java虚拟机》

1 场景

java创建好对象后,访问对象的时候,java程序需要通过栈上reference引用来操作堆上具体对象

JVM规范未规定对象的访问方式,对象的访问方式由虚拟机决定

2 版本

JDK:1.8

虚拟机:hotspot

3 说明

主流的对象访问方式有:句柄直接指针两种。

普遍使用的Hot Spot虚拟机,使用的是直接指针的方式。

3.1 句柄

java中划分一块内存作为句柄池reference中存储的是句柄的地址

句柄中包含了“对象实例数据”和“类型数据”各自的具体地址

3.1.1 图示
1613310832641.png
3.1.2 特点
  • 优点

reference中存储的是稳定不变的句柄地址。

当进行垃圾回收的时候,如果对象被移动(内存地址发生变动),只需要更改堆中句柄池句柄的地址,栈上reference本身不需要进行更改

  • 缺点

通过reference访问句柄池中的句柄,需要一次指针定位;访问对象实例数据,需要一次指针定位;访问对象类型数据,需要一次指针定位

每次访问一个对象,需要进行三次指针定位。

3.2 直接指针

reference中存储的是对象的地址,对象实例数据中存储类型的指针地址

3.2.1 图示
1613310514398.png
3.2.2 特点
  • 优点

通过栈上reference访问句柄池中的句柄,需要一次指针定位;访问对象类型数据,需要一次指针定位。每次访问一个

对象,需要进行两次指针定位。

句柄的方式比,最大的好处是速度快reference直接存储的是对象实例数据的地址,节省了一次对象实例指针定位的时间开销。

因为对象的访问在Java中非常频繁,这类开销多了后是非常可观的执行成本。

  • 缺点

进行GC回收的时候,对象存储位置如果在堆上发生变动栈上reference上的地址将发生变动。

相关文章

网友评论

    本文标题:java对象的访问定位

    本文链接:https://www.haomeiwen.com/subject/yhyuxltx.html