Java对象的四种引用

介绍

从JDK1.2开始,设计人员把对象的引用细分成强引用,软引用,弱引用,虚引用四个级别,细分的准则体现在GC回收的优先级上:强引用>软引用>弱引用>虚引用

从JDK1.2,CG垃圾回收器回收对象时,对象的有效性分析不仅仅是需要考虑对象可达性,还序号考虑对象的引用强度,从而使程序可以更加灵活地控制对象的生命周期,对象的有效性=可达性+引用类型

强引用

强引用表示一个对象处在有用必须的状态,是使用最为普遍的引用。如果一个对象具有强引用,那么垃圾回收器绝不会回收他,就算内存不足的情况下,Java虚拟机宁可抛出OutOfMemoryError错误,使程序异常终止,也不会通过回收具有强引用的对象来解决内存不足的问题

Student student = new Student(); // 这就是强引用

后面的软引用、弱引用、虚引用,都需要强引用的对象。意思就是说必须先有强引用的对象,然后再在这个强引用对象上做文章,通过一定的操作变成软引用、弱引用或者虚引用的对象

软引用

软引用表示一个对象处在有用但是非必须的状态,在内存空间足够的情况下,如果一个对象具有软引用,那么垃圾回收器不会回收他,但是当内存不足的时候,垃圾回收器就会回收,在发生OutOfMemory之前。只要垃圾回收器美誉回收他,这个对象就能被程序使用

软引用可以用来实现内存敏感的高速缓存

软引用可以和一个引用队列联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个对象加入到与之关联的引用队列中,以便在恰当的时机将该软引用回收,但是由于GC线程的优先级比较低,因此通过手动调用System.gc()并不能立即执行GC,因此此软引用并不一定会被马上回收

Student student = new Student();
SoftReference softReference = new SoftReference(student);

弱引用

弱引用表示一个对象处在可能有用,但是非必须的状态,类似于软引用,但是强度比软引用更弱一些:只有具备弱引用的对象拥有跟短暂的生命周期。GC线程在扫描他所在管辖的内存区域的过程中,一旦发现只具有弱引用的对象,就会回收掉这些被弱引用关联的对象,也就是说,无论当前内存是否紧缺,GC都会回收弱引用相关联的对象。不过,由于GC是一个低优先级的线程,因此不一定会很快的发现那些具有弱引用的对象

弱引用同样可以和一个引用队列联合使用,如果弱引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中

Student student = new Student();
WeakReference weakReference = new WeakReference(student);

虚引用

虚引用表示一个对象处在无用的状态,这意味着虚引用等于没有引用,在任何时候都可能被垃圾回收。设置虚引用的目的是为了被虚引用关联的对象在被垃圾回收器回收的时候,能够收到一个系统通知(用来跟踪对象被垃圾回收的活动)

虚引用和弱引用的区别在于:虚引用的使用必须和引用队列联合使用

ReferenceQueue referenceQueue = new ReferenceQueue();
PhantomReference phantomReference = new PhantomReference(object, queue);

这意味着,GC在回收一个对象时,如果发现该对象具有虚引用,那么在回收之前就会首先将该对象的虚引用加入到与之关联的引用队列中,程序可以通过判断引用队列中是否已经加入虚引用来了解被引用的对象是否将要被GC回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值