一般来说,一个java的引用访问涉及到三个内存区域:JVM栈、堆、方法区;

以最简单的本地变量引用为例: Object obj = new Object();

    Object obj是一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型的数据;

    new Object()作为一个实例对象,存储在堆区中

    堆中还记录了Object类的类型信息(接口、field、方法、对象类型等)的地址,这些地址所执行的数据存储在方法区中。在java虚拟机规范中,对于通过reference类型引用具体对象方式并未做规定,目前主流的实现方式有两种:

    1、通过句柄访问

java的GC机制--java对象的访问方java的GC机制--java对象的访问方

通过句柄访问的实现方式中,JVM堆中会有一块区域作为专门的句柄池,储存相关句柄池所执行的实例数据地址(包括在堆中的地址和方法区中的地址)。这种实现方法由于用句柄表示地址,应此十分稳定。

  2、通过直接指针访问:

java的GC机制--java对象的访问方java的GC机制--java对象的访问方

通过直接指针访问的方式中,reference中直接储存的就是对象在堆中的实际地址,在堆中储存的信息还包括在方法区中相应类型数据。这种方法最大的优势就是速度快,在HotSpot虚拟机中就是采用的这种方式。


相关文章:

  • 2021-10-27
  • 2022-12-23
  • 2021-08-23
  • 2022-01-21
  • 2021-08-08
  • 2022-12-23
  • 2021-11-09
  • 2021-06-18
猜你喜欢
  • 2021-05-19
  • 2021-12-06
  • 2021-06-18
  • 2022-01-28
  • 2021-05-21
  • 2022-12-23
相关资源
相似解决方案