在java中,有四种引用,分别为强引用、软引用、弱引用与虚引用,它们有各自不同的特性,使用场景也各不相同,下面我就对他们分别作出说明。
强引用
强引用是最普遍的引用。如果对象具有强引用,那么垃圾回收器绝不会回收它。当内存空间不足时,jvm宁愿OOM也不会随意回收具有强引用的对象。如果强引用的对象不使用时,需要将它弱化从而使GC能够回收它。比如显示的将它置为null;或者让其超出对象的生命周期范围,那么GC就认为该对象不存在引用,这时就能回收它了。具体什么时候回收就要取决于GC算法了。
public void test(){
// 强引用
Object strongReference = new Object();
}
在一个方法内部有一个强引用,这个引用保存在栈中,而引用的对象保存在堆中。当这个方法运行完成后,就会退出方法栈,引用对象的引用数就是0,这个对象就可以被回收。
但是如果这个对象是全局变量时,就需要在不使用时将其置为null,否则无法被垃圾回收。
软引用
如果一个对象只具有软引用,则内存空间充足时,垃圾回收不会回收它;如果内存空间不足时,就会回收这些对象。只要垃圾回收没有回收它,该对象就可以被程序使用。
// 强引用
String strongReference = new String("123");
// 软引用
String str = new String("123");
SoftReference<String> softReference = new SoftReference<>(str);
当内存不足时,jvm会首先将软引用的对象引用置为null,然后通知垃圾回收器进行回收。而且jvm会尽可能的优先回收长时间闲置不用的软引用对象。对那些刚构建或刚使用过的软引用对象会尽可能保留。为此引入了引用队列(ReferenceQueue)的概念。如果软引用的对象被垃圾回收,jvm就会把这个软引用加入到与之关联的引用队列中。
弱引用
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短的生命周期。在垃圾回收器进行扫描时,一旦发现只有弱引用的对象,不管内存空间是否充足,都会回收它。不过,垃圾回收器是一个优先级很低的线程,因此不一定很快就能发现那些只有弱引用的对象。
// 弱引用
String str = new String("123");
WeakReference<String> weakReference = new WeakReference<>(str);
如果一个对象很少被使用,并且希望在使用时随时就能获得,但又不想影响此对象的垃圾回收,那么就可以用WeakReference来记住此对象。
如果你希望将一个弱引用变成强引用,可以使用weakReference.get();
// 弱引用
String str = new String("123");
WeakReference<String> weakReference = new WeakReference<>(str);
// 弱引用转强引用
String strongReference = weakReference.get();
同样,如弱引用的对象被垃圾回收,jvm就会把这个弱引用加入到与之关联的引用队列中。
虚引用
虚引用顾名思义,就是形同虚设。虚引用并不会决定对象的生命周期,如果一个对象只有虚引用,那它就和没有任何引用一样,在任何时候都可以被垃圾回收器回收。
虚引用必须和引用队列联合使用。当垃圾回收器回收一个对象时,如果发现他有虚引用,就会在回收对象前,把虚引用加入与之关联的引用队列中。
String str = new String("123");
// 引用队列
ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
// 虚引用
PhantomReference<String> phantomReference = new PhantomReference<>(str,referenceQueue);
虚引用主要用来跟踪对象被垃圾回收的活动。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否要进行垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
总结
引用级别强 -> 弱 : 强引用 -> 软引用 -> 弱引用 -> 虚引用
| 引用类型 | 被垃圾回收时间 | 用途 | 生存时间 |
|---|---|---|---|
| 强引用 | 从不会 | 对象的一般状态 | jvm终止 |
| 软引用 | 内存不足时,先回收长时间不用的 | 对象缓存 | 内存不足 |
| 弱引用 | 垃圾回收时 | 对象缓存 | 垃圾回收 |
| 虚引用 | 垃圾回收时 | 跟踪对象的垃圾回收 | 垃圾回收 |