今天说一说对象的四种引用

对象的引用分为四大类,有意思的是,他们的简称都很有代表性,分别是“强”、“弱”、“虚”、“软”。
从 JDK1.2 版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。
(1)强引用:
强引用只要引用存在,垃圾回收器就永远不会回收。

Object obj=new Object();
User user=new User();

可直接通过obj取得对应的对象,如obj.equals(new Object());而这样obj对后边的Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常用到的编码形式。

(2)软引用:
非必须引用,内存溢出之前进行回收,可通过以下代码实现:

Object obj=new Object();
SoftReference<Object> sf=new SoftReference<Object>(obj);
obj=null;
sf.get();//有时候会返回null

这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要被回收的对象时,则返回null;
软引用主要用于实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无须从繁忙的真实来源查询数据,提升了速度;
当内存不足时,自动删除这部分缓存数据,从真正来源查询这些数据。

(3)弱引用:
第二次垃圾回收时回收,可以通过如下代码实现:

Object obj=new Object();
WeakReference<Object> wf=new WeakReference<Object>(obj);
obj=null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾

弱引用是在第二次垃圾回收时被回收,短时间内通过弱引用取对应的数据,则可以取到,当第二次垃圾回收执行之后,将返回null;
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued()方法返回对象是否已被垃圾回收器标记。

(4)虚引用:
垃圾回收时回收,无法通过引用取到对象值,可通过如下代码实现:

Object obj=new Object();
PhantomReference<Object> pf=new PhantomReference<Object>(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除

虚引用在每次垃圾回收的时候都会被回收,通过虚引用的get()方法,永远获取到的都是null,因此也被称为“幽灵引用”。
虚引用主要用于检测对象是否已从内存中删除。

区别:
强引用有如下特点:

强引用可以直接访问目标对象
强引用(存在)指向的对象任何时候都不会被回收,JVM宁愿抛出OOM异常,也不会回收。
强引用可能会导致内存泄漏
解释: 1. 内存溢出(out of memory) 是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory.

内存泄漏(memory leak) 是指程序申请内存后,无法释放已申请的内存空间,这样的泄漏积少成多,memory leak 会导致 out of memory .

软引用使用场景:

图片缓存。图片缓存框架中,“内存缓存”中的图片是以这种引用保存,使得 JVM 在发生 OOM 之前,可以回收这部分缓存。

网页缓存。

弱引用使用场景:
在静态内部类中,经常会使用虚引用。例如:一个类发送网络请求,承担 callback 的静态内部类,则常以虚引用的方式来保存外部类的引用,当外部类需要被 JVM 回收时,不会因为网络请求没有及时回应,引起内存泄漏。

虚引用使用场景:
一般可以通过虚引用达到回收一些非java内的一些资源比如堆外内存的行为。例如:在 DirectByteBuffer 中,会创建一个 PhantomReference 的子类Cleaner的虚引用实例用来引用该 DirectByteBuffer 实例,Cleaner 创建时会添加一个 Runnable 实例,当被引用的 DirectByteBuffer 对象不可达被垃圾回收时,将会执行 Cleaner 实例内部的 Runnable 实例的 run 方法,用来回收堆外资源。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值