什么是引用
在Java代码中,是通过引用来访问对象数据的,比如:
Object obj = new Object();
其中的obj就是一个引用,而通过应用访问真实数据的常见方法有两种:另一种方法:
引用的类型
引用的不同类型决定了他们面对GC的不同表现。我们通常用到是强引用,如果有强引用指向某个对象,那么这个对象就不会被GC回收掉(这句话是有漏洞的,但是一时不知道怎么说才好)。而弱引用(WeakReference)则不同,如果只剩下弱引用,那么在下次GC的时候就会被回收掉,举个例子:
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
public class Main {
public static void main(String[] args) throws Exception {
Object referene = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
WeakReference<Object> ref = new WeakReference<Object>(referene, queue)
;
referene = null;
System.out.println(ref.get());// java.lang.Object@6bbc4459
System.out.println(ref.isEnqueued());// false
System.gc();
System.out.println(ref.isEnqueued());// true
System.out.println(ref.get());// null
}
}
在运行的时候加上参数:-verbose:gc
输出的结果如下:
java.lang.Object@3a3ee284
false
[GC 1262K->320K(120576K), 0.0006371 secs]
[Full GC 320K->197K(120576K), 0.0045087 secs]
true
null
弱引用的用法在ThreadLocal里面就看的比较明白了,想类似的情况中如果不用弱引用的话可能导致内存泄露,进而OOM。
SoftReference和WeakReference有点像:GC都不会因为他们而放过对象,但是区别在于,软引用只有在内存吃紧的时候才会被回收掉。这样是的软引用适合做本地缓存,因为既不会导致OOM,也能使得对象存活的尽量的久。
而PhantomReference则又不相同,有没有他没什么区别,并不会影响GC会不会回收对象,不过他有一个作用是能看到对象是什么时候被回收掉的。
----------END----------