- 强引用:普通的引用,强引用指向的对象不会被回收;
- 软引用:仅有软引用指向的对象,只有发生gc且内存不足,才会被回收;
- 弱引用:仅有弱引用指向的对象,只要发生gc就会被回收。
- 虚引用:在任何时候都可能被垃圾回收器回收。
虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,
如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
例子:
package com.example.demo.thread;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
/**
* java强引用-软引用-弱引用
* 强引用:普通的引用,强引用指向的对象不会被回收;
* 软引用:仅有软引用指向的对象,只有发生gc且内存不足,才会被回收;
* 弱引用:仅有弱引用指向的对象,只要发生gc就会被回收。
* @author zhangming
* @version 1.0
* @date 2019-12-23 18:53
*/
public class WeakRefDemo {
public static void main(String[] args) {
Object a = new Object();
Object b = new Object();
Object c = new Object();
Object d = new Object();
//强引用
Object strongA = a;
//软引用
SoftReference<Object> softB = new SoftReference<>(b);
//弱引用
WeakReference<Object> weakC = new WeakReference<>(c);
//虚引用
ReferenceQueue queue = new ReferenceQueue();
PhantomReference prD = new PhantomReference(d,queue);
a = null;
b = null;
c = null;
d = null;
System.out.println("Before gc...");
System.out.println(String.format("strongA = %s, softB = %s, weakC = %s,prD = %s", strongA, softB.get(), weakC.get(),prD.get()));
System.out.println("Run GC...");
System.gc();
System.out.println("After gc...");
System.out.println(String.format("strongA = %s, softB = %s, weakC = %s,prD = %s", strongA, softB.get(), weakC.get(),prD.get()));
}
}
执行结果:
Before gc...
strongA = java.lang.Object@3d646c37, softB = java.lang.Object@41cf53f9, weakC = java.lang.Object@5a10411,prD = null
Run GC...
After gc...
strongA = java.lang.Object@3d646c37, softB = java.lang.Object@41cf53f9, weakC = null,prD = null
总结
引用类型 | 被垃圾回收时间 | 用途 | 生存时间 |
---|---|---|---|
强引用 | 从来不会 | 对象的一般状态 | JVM停止运行时终止 |
软引用 | 当内存不足 | 对象缓存 | 内存不足时终止 |
弱引用 | 正常垃圾回收时 | 对象缓存 | 垃圾回收后终止 |
虚引用 | 正常垃圾回收时 | 跟踪对象的垃圾回收 | 垃圾回收后终止 |