软引用
软引用是一种比强引用生命周期稍弱的一种引用类型。在JVM内存充足的情况下,软引用并不会被垃圾回收器回收,只有在JVM内存不足的情况下,才会被垃圾回收器回收。所以软引用的这种特性,一般用来实现一些内存敏感的缓存,只要内存空间足够,对象就会保持不被回收掉,比如网页缓存、图片缓存等。
SoftReference
构造方法支持传递一个 ReferenceQueue
队列,支持被释放后加入到队列。
public class SoftReferenceExample {
public static void main(String[] args) {
SoftReference<String> softRefTitle = new SoftReference<>(new String("福报领袖"));
System.out.println("JackMa - " + softRefTitle.get());
System.gc();
if (null == softRefTitle.get()) {
System.out.println("JackMa 改邪归正!");
} else {
System.out.println("JackMa - " + title);
}
}
}
输出
JackMa - 福报领袖
JackMa - 福报领袖
弱引用
弱引用是一种比软引用生命周期更短的引用。他的生命周期很短,不论当前内存是否充足,都只能存活到下一次垃圾收集之前。
WeakReference<String> weakReference = new WeakReference<>(new String("福报领袖"));
System.out.println("JackMa - " + weakReference.get());
System.gc();
if (null == weakReference.get()) {
System.out.println("JackMa 已经改邪归正!");
} else {
System.out.println("JackMa - " + weakReference.get());
}
输出
JackMa - 福报领袖
JackMa 已经改邪归正!
虚引用
虚引用与前面的几种都不一样,这种引用类型不会影响对象的生命周期,所持有的引用就跟没持有一样,随时都能被GC回收。需要注意的是,在使用虚引用时,必须和引用队列关联使用。在对象的垃圾回收过程中,如果GC发现一个对象还存在虚引用,则会把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象内存被回收之前采取必要的行动防止被回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。
ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> ref = new PhantomReference<String>(new String("福报领袖"), queue);
System.out.println("JackMa - " + ref.get());
System.gc();
if (null == ref.get()) {
System.out.println("JackMa 已经改邪归正!");
} else {
System.out.println("JackMa - " + ref.get());
}
相关参考
https://www.zhihu.com/question/37401125/answer/337717256
https://www.jianshu.com/p/ca6cbc246d20
网友评论