对象访问定位的两种方式对比
Java对象在堆中创建后,栈上的引用如何定位到对象?请对比句柄访问和直接指针访问的优缺点。
回答
我还是少年
对象访问定位有两种主流方式:
1. 句柄访问
- Java栈的reference指向堆中句柄池,句柄池包含对象实例数据和类型数据的地址。
- 优点:GC移动对象时只需更新句柄中的指针,reference不变,对用户透明。
- 缺点:两次指针访问,速度慢。
2. 直接指针(HotSpot默认)
- reference直接指向堆中对象实例数据,对象头中存储指向方法区类型数据的指针。
- 优点:一次指针访问,速度快。
- 缺点:GC移动对象时需要更新所有reference。
HotSpot使用直接指针方式访问,因为GC停顿是主要优化目标,而对象访问频率极高,性能收益大于GC时的指针更新成本。