对象的访问定位方式:句柄、直接指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013617791/article/details/84074609

建立对象是为了使用对象,我们的Java程序需要通过栈上的reference引用来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位、访问堆中的对象的具体位置,所以对象访问方法也是取决于虚拟机的实现而决定的。目前主流的访问方式有使用句柄和直接指针两种。

  • 什么是句柄
    句柄是指针的指针,句柄实际上是一个数据,是一个Long (整长型)的数据。句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样。
    Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。

访问对象常用的两种方式

  • 1 通过句柄访问对象
    • 优点: reference存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要改变。
    • 缺点: 增加了一次指针定位的时间开销。
      在这里插入图片描述
  • 2 通过直接指针访问对象(HotSpot使用的方式)
    • 优点: 节省了一次指针定位的开销。
    • 缺点: 在对象被移动时reference本身需要被修改。
      在这里插入图片描述

参考文献

https://www.jianshu.com/p/8580ab50e261 访问对象常用的两种方式
https://blog.csdn.net/jxiao_11/article/details/51158863 句柄是什么

猜你喜欢

转载自blog.csdn.net/u013617791/article/details/84074609