深入理解java虚拟机学习笔记 - 程序如何访问内存中的对象示例

程序如何访问内存中的对象示例

  • 程序通过栈上的reference 数据来操作堆上的具体的实例对象,如何操作呢?一般分两个操作方式 句柄 和 直接指针的方式。

句柄

  • 句柄本质是一个唯一的整数,可以作为对象的身份Id来识别不同的对象/同一类型的对象不同的示例。

句柄访问堆上的实例数据

  • 如果通过句柄的方式访问对象,首先在堆中会分配一小块内存作为句柄池,顾名思义存放不同的句柄。程序访问堆上的具体过程如下所示:
  1. 首先程序访问reference 数据,而reference 中存储 存放对象的句柄地址,即存放对象对应句柄在句柄池的内存地址。
  2. 句柄存放在句柄池中,句柄中包含对象的实例数据的内存地址
  3. 程序访问reference 中存储句柄地址访问到句柄的信息,句柄信息中包含了实例对象的实例数据,进而可以访问实例对象。

程序 --> reference 数据 --> 句柄 --> 实例对象

直接指针访问对象实例数据

  • 如果通过直接指针进行访问数据,就比通过句柄访问实例数据简单了很多,省去了句柄这个角色,因为在reference 数据直接存放实例对象的具体的内存地址,程序直接访问reference 数据 可以直接访问内存地址。

两者的优缺点

  • 句柄的方式:实现比较复杂,创建对象的中要维护更多的信息,优点:reference 数据存储稳定的句柄地址,在对象被移动(垃圾回收等)只需要句柄的指针。
  • 直接指针方式,访问对象比较快速,Hotspot虚拟机采用的就是直接指针的方式,缺点就是:对象的移动需要频繁的改变reference 数据。
发布了59 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_33249725/article/details/100542575