public class Demo1 {
private void method() {
A a = new A();
}
}
简单说下上面代码实例化类A的内存分配情况,引用变量a保存在虚拟机栈中的本地变量表,该引用指向的对象实例数据保存在Java堆中。
现在有一个问题疑问就是:
Java程序通过栈中的引用来操作Java堆上的具体对象,那么虚拟机栈的本地变量表的引用怎么访问Java堆中的具体对象呢?
经过查阅资料可知,对象的访问方式取决于虚拟机的实现,并且主流访问方式有句柄池和直接指针。
句柄池
句柄池方式访问对象Java堆中将会划出一块内存来作为句柄池,引用对象存储的就是对象的句柄地址。句柄中包含了对象实例数据和对象类型数据的具体地址。
直接指针
直接指针方式访问对象对象实例数据包含了到对象类型数据的具体地址。
总结
这两种对象的访问方式各有优势,使用句柄访问方式的最大好处就是引用对象中存放的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的对象实例数据指针,而对象引用不需要修改。使用直接指针访问方式的最大好处是速度快,它节省了一次指针定位的时间开销。目前Java默认使用的HotSpot虚拟机采用的便是是第二种方式进行对象访问的。
网友评论