一般来说,一个java的引用访问涉及到三个内存区域:JVM栈、堆、方法区;
以最简单的本地变量引用为例: Object obj = new Object();
Object obj是一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型的数据;
new Object()作为一个实例对象,存储在堆区中
堆中还记录了Object类的类型信息(接口、field、方法、对象类型等)的地址,这些地址所执行的数据存储在方法区中。在java虚拟机规范中,对于通过reference类型引用具体对象方式并未做规定,目前主流的实现方式有两种:
1、通过句柄访问
通过句柄访问的实现方式中,JVM堆中会有一块区域作为专门的句柄池,储存相关句柄池所执行的实例数据地址(包括在堆中的地址和方法区中的地址)。这种实现方法由于用句柄表示地址,应此十分稳定。
2、通过直接指针访问:
通过直接指针访问的方式中,reference中直接储存的就是对象在堆中的实际地址,在堆中储存的信息还包括在方法区中相应类型数据。这种方法最大的优势就是速度快,在HotSpot虚拟机中就是采用的这种方式。