Java对象是如何被访问定位的?

帅旋
帅旋
关注
充电
发布于 2024-04-21 | 更新于 2025-02-15

引言:对象的访问定位为何重要?

Java对象的访问定位是JVM内存管理的核心机制之一,直接关系到程序性能与GC效率。JVM规范未强制规定具体实现方式,这为不同虚拟机提供了优化空间。

本文以HotSpot虚拟机为例,深度剖析两种主流访问方式的技术细节与设计取舍。


1. 两种访问方式的技术对比

1.1 句柄访问(Handle)

内存结构

1
2
3
4
5
6
7
8
9
10
+-------------------+      +-----------------+
| Java Stack | | Handle Pool |
|-------------------| |-----------------|
| reference → handle|----→ | instance data ptr|
+-------------------+ | class data ptr |
+-----------------+

+-----------------+
| Instance Data |
+-----------------+
  • 优点:

    • 稳定性:引用中存储的是稳定的句柄地址,当对象在GC过程中被移动时,只需更新句柄中的实例数据指针,引用本身不需要修改。

    缺点:

    • 访问开销:每次访问对象时,需要通过句柄间接定位对象实例,增加了一次指针定位的开销。

1.2 直接指针(Direct Pointer)

在直接指针访问方式中,引用中直接存储对象的地址。对象头中包含类型指针,用于指向对象的类型数据。

1
2
3
4
5
6
7
+-------------------+      +-----------------+
| Java Stack | | Object Header |
|-------------------| |-----------------|
| reference → object|----→ | Mark Word |
+-------------------+ | Class Pointer |
| Instance Data |
+-----------------+

优点:

  • 访问速度:由于引用直接指向对象实例,访问速度更快,减少了一次指针定位的时间开销。

缺点:

  • GC复杂性:在GC过程中,如果对象被移动,需要更新所有指向该对象的引用,增加了GC的复杂性。

2. HotSpot的极致性能优化

HotSpot虚拟机主要采用直接指针的方式进行对象访问。这种方式提高了对象访问的效率,但也对GC的实现提出了更高的要求。

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/faqs/jvm/how-java-objects-are-accessed-and-located.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。