弱引用为什么一定会被回收?

网上都说,垃圾回收的时候看到弱引用就一定会被回收,这是为什么呢?

如果一个对象超出作用域 就会回收
如果一个引用类型的地址有被使用 比如全局或者这个对象的属性 就等对象生命周期结束回收
同理

垃圾回收器发现一个对象上只有弱引用,此时不管内存够不够,这个对象都会被回收。

下面通过一段简单的代码来看一下软引用和弱引用的具体用法;

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一下看看,如下图所示,只有弱引用的对象在内存空间足够的时候没有被回收,对象在只有弱引用的时候被垃圾回收器回收。

img

  • 强引用是没有其他引用才会被回收。
  • 软引用是内存不够才会被回收。
  • 弱引用是只要发生 GC 就会被回收。
  • 虚引用和没有引用一样,任何时候都会被 GC。

不管那种引用类型都会垃圾收集器回收,只是弱引用更容易被回收。

这就是垃圾回收的机制,没有为什么
就像说,在篮球场上打人一定会被裁判吹犯规一样
我觉得你在问为什么之前,不应该先问问,到底什么是弱引用,这种更基本的问题吗

gc原理吧,我也想了解了解 ^.^

因为它就是弱引用,它的命运(生命周期)注定是要被回收的。java回收机制中有“竞争”概念,这是相对于某个对象的被引用级别形成的概念。也就是说,强软弱,三个字可以大致概括Java中所有的对象的引用级别。那么自然而然,弱级别被回收的概率要大于另外两个。而这里要说的是WeakReference对象,它的出现就是使得某一个对象反持久化,not finalized;