强引用、软引用、弱引用、幻象引用

在java语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象。

不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。

强引用(Strong Reference):

最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还活着,垃圾收集器不会碰这种对象。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域,

或者显示的被引用赋值为null,就可以被垃圾收集了,当然还得看垃圾收集策略。

软引用(Soft Reference):

是一种相对强引用弱化一点的引用,可以让对象豁免一些垃圾收集,只有当JVM认为内存不足时,才会回收软引用指向的对象。JVM在确保OOM之前,清理软引用指向的对象。

软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存。

软引用特点:

软引用通过SoftReference类实现。软引用的生命周期比强引用短一些,软引用可以和引用队列(ReferenceQueue)联合使用,如果软引用被垃圾回收器回收,JVM就会把软引用加入到与之

关联的引用队列中,后续,我们可以通过poll()方法来检查是否有他关心的对象被回收,如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。

弱引用(Weak Reference):

弱引用并不能使对象豁免垃圾收集,仅仅是让对象提供一种在弱引用状态下访问的途径。这就可以用来构建一种没有特定约束的关系。比如维护一种非强制性的约束关系,试图获取时对象还在,

就使用他,否则重新实例化。同样是很多缓存实现的选择。

弱引用特点:

弱引用生命周期比软引用还短,通过WeakReference类实现。在垃圾回收器线程扫描它所管辖的内存区域时,一旦发现具有弱引用的对象,就会收回。由于垃圾回收器是一个优先级很低的线程,

因此不一定会很快回收弱引用的对象,弱引用可以和引用队列(ReferenceQueue)联合使用,如果弱引用被垃圾回收器回收,JVM就会把软引用加入到与之

关联的引用队列中。

幻像引用(Phantom Reference):

也叫虚引用,不能通过它访问对象,幻像引用仅仅是确保对象被finalize后做某些事情的机制,比如通常做所谓的Post-Modern清理机制,还有Cleaner机制,有人利用幻象引用监控对象的创建和销毁。

幻象引用特点:

无法通过幻象引用访问对象的任何属性和函数,如果一个对象仅持有幻象引用,就和没有引用一样,任何时候都可能被回收,幻象引用必须和引用队列联合使用,当垃圾回收器线程准备回收一个对象时,

如果发现它还有幻象引用,就会在垃圾回收之前,把幻象引用加入到与之关联的引用队列中。

ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);

程序可以通过判断引用队列中是否已经加入了幻象引用,来了解被引用的对象是否即将被垃圾回收,如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取一些程序行动。

应用场景:可以用来跟踪对象被垃圾回收的活动,当一个幻象引用的对象被垃圾回收前一定会收到一条系统通知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值