Java中我们创建一个对象
Object obj = new Object();
其中obj作为对象的引用是分配在我们的栈内存中的,而我们的对象实例是分配在我们的堆内存中的。
对象实例其实包含了两部分,
- 存储Object对象所有实例数据的结构化内存
- 存储Object类型信息的指针,其实就是指向该对象对应的Class对象的地址指针
其中我们的obj引用在虚拟机规范里只规定了一个指向对象的引用,并没有指定需要哪种实现方式,因此不同的虚拟机有不同的实现方式,主流的有两种:
- 通过句柄
- 通过直接指针
这两种方式各有各的优缺点:
- 使用句柄的最大优点就是引用指向的是一个稳定的句柄地址,对象的移动只会改变句柄中的实例数据的地址,而reference本身不需要更改;
- 使用直接指针的好处是速度快,它节省了一次指针寻址的时间开销,由于java中对象的寻址很频繁,因此累加起来这也是一笔不少的开销,hotspot虚拟机是使用第二种方式访问对象的。
以上内容参考了<<深入理解java虚拟机>>。
网友评论