对象的访问定位
JAVA程序通过虚拟机栈的reference操作堆上的具体对象
虚拟机规范定义
JAVA虚拟机规范中规定reference是一个指向对象的引用,但并未定义这个引用应该通过什么方式定位及访问堆中的对象的具体位置,所以对象访问方式可由虚拟机自行实现
主流访问方式
句柄:如果使用句柄访问对象,JAVA堆中将会划分一块内存作为句柄池,reference中存储的就是对象的句柄地址,句柄中包含对象实例数据与类型数据
直接指针:如果使用直接指针访问,则reference存储对象地址
对HotSpot虚拟机来说,由于JVM栈本地变量表中对象的reference类型引用使用直接指针,该指针指向堆内存中的对象,所以对象头中是需要存储它的类元数据指针,该指针指向方法区中对象类型数据
优劣
- 使用句柄访问的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾回收时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要修改
- 使用直接指针访问的最大好处就是速度快,节省了一次指针定位的时间开销,由于对象的访问在JAVA中非常频繁,因此这类开销积少成多也是一项非常可观的执行成本