我们都知道,java垃圾回收都是由JVM自动进行的,而垃圾回收机制的根据就在于该对象有没有引用。
Java共有四种引用方式:
- 强引用
- 软引用
- 弱引用
- 虚引用
强引用
创建一个对象并将其赋给一个引用变量,这就是强引用,而强引用的特点在于,引用的变量永远不会被GC回收,即使发生内存溢出,照样不会!
软引用
软引用(SoftReference),如果一个对象是被软引用,当内存足够时,就不会对它进行垃圾回收,如果内存不够时,才会对它进行回收。而JVM对于软引用的回收也是根据软引用中被闲置的时间长短来决定,对于长时间被闲置的弱引用对象,JVM会优先回收。在需要高速缓存的情况下,软引用可以起到很好的效果。
弱引用
弱引用(WeakReference),只要开始垃圾回收,弱引用对象一定会被回收,以下面这段代码为例,
public class WeakReferenceDemo {
public static void main(String[] args) {
Object A=new Object();
WeakReference<Object> weakReference=new WeakReference<>(A);
System.out.println(A);
System.out.println(weakReference.get());
A=null;
System.out.println("==================");
System.out.println(A);
//手动设置垃圾回收
System.gc();
System.out.println(weakReference.get());
}
}
得到结果如下:
java.lang.Object@1540e19d
java.lang.Object@1540e19d
==================
null
null
虚引用
虚引用(PhantomReference),相对于其他三种引用方式来讲,虚引用有种形同虚设的感觉,不论什么时候,虚引用的get()方法返回的总是null,一个对象被虚引用,其实就跟没有引用一样,垃圾回收器可以随时将其回收,而虚引用和其他三种引用方式不同的是,在使用虚引用时,都要配合引用队列(ReferenceQueue)使用,当垃圾回收期回收对象时,如果发现对象存在虚引用,就会将这个虚引用加入到它的引用队列中,