网上都说,垃圾回收的时候看到弱引用就一定会被回收,这是为什么呢?
如果一个对象超出作用域 就会回收
如果一个引用类型的地址有被使用 比如全局或者这个对象的属性 就等对象生命周期结束回收
同理
垃圾回收器发现一个对象上只有弱引用,此时不管内存够不够,这个对象都会被回收。
下面通过一段简单的代码来看一下软引用和弱引用的具体用法;
import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;public class ReferenceDemo { public static void main(String[] args) { //强引用 String str = new String("abc"); //弱引用 SoftReference<String> softRef = new SoftReference<>(str); str = null; //去掉强引用 System.gc(); //垃圾回收器进行回收 System.out.println(softRef.get()); //强引用 String abc = new String("123"); //弱引用 WeakReference<String> weakRef = new WeakReference<>(abc); abc = null; //去掉强引用 System.gc(); //垃圾回收器进行垃圾回收 System.out.println(weakRef.get()); }}
通过上面这个例子,我们来分析一下软引用和弱引用的差别,首先看弱引用的例子,我们先定义了一个强引用对象,然后我们给这个强引用对象加了一个软引用,这里要注意软引用的写法是SoftReference,然后我们通过str = null来去掉str对象的强引用,此时str这个对象只有一个软引用,通过System.gc();我们进行了一次垃圾回收,因为str这个对象只有一个弱引用,没有强引用,而这是内存足够,所以说这个对象是不会被垃圾回收器回收的,它的输出是abc。
然后我们看第二个例子,首先定义了一个强引用对象,然后给这个对象加了一个弱引用,这里给对象加弱引用的方法是WeakReference,我们再通过abc = null,去掉这个对象的强引用,此时abc这个对象就只有一个弱引用,通过System.gc()进行了一次垃圾回收,这个适合abc这个对象没有强引用,只有一个弱引用,根据弱引用的定义,在垃圾回收之后,这个对象会被回收的,所以说弱引用的输出结果是null。
那么最终的结果是不少我们分析的这样,我们run一下看看,如下图所示,只有弱引用的对象在内存空间足够的时候没有被回收,对象在只有弱引用的时候被垃圾回收器回收。
不管那种引用类型都会垃圾收集器回收,只是弱引用更容易被回收。
这就是垃圾回收的机制,没有为什么
就像说,在篮球场上打人一定会被裁判吹犯规一样
我觉得你在问为什么之前,不应该先问问,到底什么是弱引用,这种更基本的问题吗
gc原理吧,我也想了解了解 ^.^
因为它就是弱引用,它的命运(生命周期)注定是要被回收的。java回收机制中有“竞争”概念,这是相对于某个对象的被引用级别形成的概念。也就是说,强软弱,三个字可以大致概括Java中所有的对象的引用级别。那么自然而然,弱级别被回收的概率要大于另外两个。而这里要说的是WeakReference对象,它的出现就是使得某一个对象反持久化,not finalized;