首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

问:Java对象的访问方式有几种?

重磅干货,第一时间送达

Java对象在Java虚拟机中的引用访问方式

在前面两篇文章中了解到Java对象实例是如何在HotSpot虚拟机的Java堆中创建的,以及创建后的内存布局是怎样的。

下面我们详细了解在Java堆中的Java对象是如何访问定位的:先来了解reference类型数据是什么,再来了解两种访问方式:使用句柄或者使用直接指针(HotSpot虚拟机使用了直接指针的方式访问对象)。

1、reference类型

java程序通过reference类型数据操作堆上的具体对象;

(A)JVM层面的引用

reference类型是引用类型(Reference Types)的一种;

JVM规范规定reference类型来表示对某个对象的引用,可以想象成类似于一个指向对象的指针;

对象的操作、传递和检查都通过引用它的reference类型的数据进行操作;

(B)Java语言层面的引用

(i)JDK1.2前的引用定义

如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用;

这种定义太过狭隘,无法描述更多信息;

(ii)JDK1.2后,对引用概念进行了扩充,将引用分为:

(1)强引用(Strong Reference)

程序代码普遍存在的,类似”Object obj=new Object()”;

只要强引用还存在,GC永远不会回收被引用的对象;

(2)软引用(Soft Reference)

用来描述还有用但并非必需的对象;

直到内存空间不够时(抛出OutOfMemoryError之前),才会被垃圾回收;

最常用于实现对内存敏感的缓存;

SoftReference类实现;

(3)弱引用(Weak Reference)

用来描述非必需对象;

只能生存到下一次垃圾回收之前,无论内存是否足够;

WeakReference类实现;

(4)、虚引用(Phantom Reference)

也称为幽灵引用或幻影引用;

完全不会对其生存时间构成影响;

唯一目的就是能在这个对象被回收时收到一个系统通知;

PhantomRenference类实现;

2、对象访问方式

虽然定义的reference类型数据来作为对象内存数据的引用,但JVM规范没有定义这个引用应该通过何种方式定位、访问堆上的对象,也没有不强制规定对象的内部结构应当如何表示;

这些都取决于JVM的实现,目前主流的对象访问方式有两种:

(A)使用句柄

Java堆划分一块内存作为句柄池,reference中存储就是对象的句柄地址;

对象句柄包含两个地址:

(1)在堆中分配的对象实例数据的地址;

(2)这个对象类型数据地址;

如图所示:

优点:对象移动时(垃圾回收时常见的动作),reference不需要修改,只改变句柄中实例数据指针;

(B)使用直接指针

reference中存储就是在堆中分配的对象实例数据的地址;

而对象实例数据中需要有这个对象类型数据的相关信息(前面文章讨论了HotSpot使用对象头来存储对象类型数据地址);

如图所示:

优点:

对象访问时节省了一次指针定位的时间开销,速度更快;

由于对象访问非常频繁进行,所以能较好提升性能;

HotSpot虚拟机使用了直接指针的方式访问对象;

END

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200429A0A4QK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券