强引用、软引用、弱引用和幻想引用

强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?

概论:引用是javaGC回收的一种识别机制,在对象处于不同引用情况下,GC对对象的回收也不一样。
引用类型都是java.lang,ref,Reference的子类,其中的get方法可获取这个引用的引用对象(除了幻想引用),在每个引用之间可以互相转换,通过new对应的应用类型(SoftReference,WeakReference,PhantomReference),可达性是从当前对象是否可达的分析来决定是否回收,主要有强可达(具有强引用的),最高通过软引用的访问的软可达,最高通过弱引用的弱可达,还有没有其他引用关联,并且finalize过了,只有幻象引用的幻象可达

强引用:对对象的直接的引用,一般的new创建对象,或者将一个对象赋值给一个引用类型就是强引用,强引用是最常见的,只要对象有还有强引用指向,那么对象就是"活着",GC并不会回收这些对象。而解除强引用可以把引用赋值为null,那对象就没有强引用指向,可以回收,或者当对象作用域超过的时候也会丢失强
软引用: 软引用相对于强引用比较弱,强引用是不会被回收,而软引用在内存充足的情况下不会回收。当内存不足时候,会先将软引用进行清空回收,而不会抛出OutOfMemoryError.软引用一般用于实现内存敏感度缓存,如果还有内存就暂时保存,而没有内存就清理掉,保证内存不会被耗尽,也可以保证缓存长期存在。
弱引用:弱引用是相较于软引用更为影响弱的,弱引用不影响对象的生命周期,即当对象只有弱引用指向时候,GC扫描到就会回收,但是由于GC的线程优先级比较低,所以也会存在一段时间。即有缓存就使用缓存,没缓存就重新创建,这也是一种缓存的实现方式.可用于构建没有特定约束的关系,即非强制性映射关系
幻想引用:也叫虚引用,这个引用比较特别,仅仅是在被finalize之后进行某些事情的保证机制,并不能通过他访问对象,但是其他引用本质还是对对象的访问。通常用来做Post-Mortem清理机制,可以利用幻想引用监控对象的创建和销毁。

对于幻象引用(虚引用),不能通过它访问对象。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。

虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);
程序可以通过判断引用队列中是 否已经加入了虚引用,来了解
被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

应用场景:虚引用主要用来跟踪对象被垃圾回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。

特别注意,在实际程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。

还有后面对问题的补充,后期补上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值