Java中有四种引用类型:
1.强引用(StrongReference):默认的引用类型,不会被GC回收,内存不够用时,会抛出OutOfMemoryError错误也不会将强引用类型对象回收。
2.软引用(SoftReference):软引用不保证一定不会被回收,如果内存不足,那么GC也会回收软引用对象。经常被用来实现缓存技术。
Object object = new Object(); //object对象强引用
SoftReference<Object> sf = new SoftReference<Object>(object); //软引用
object = null; //去除强引用
System.gc(); <span style="white-space:pre"> </span> //只有内存不足时才会被回收
3.弱引用(WeakReference):弱引用对象一定会被GC回收,不管内存是否不足。
WeakReference<Object> wf = new WeakReference<Object>(object);
oj = null;
System.gc(); //弱引用对象一定会被gc回收
4.虚引用(幽灵引用,phantomReference):一个对象只有虚引用,则如没有引用一样,在任何时候都可能被GC,其get()方法返回null,虚引用主要用来跟踪对象被垃圾回收的状态。
PhantomReference<Object> pf = new PhantomReference<Object>(object,new ReferenceQueue<Object>());
一个对象只有软引用、弱引用或者虚引用,则gc回收对象时会被放到一个ReferenceQueue中,WeakHashMap中就是用ReferenceQueue来实现清楚没有被强引用的Entry。
PS:GC时,除了GC所在线程外,所有线程都处于等待状态,GC优化是指减少等待的时间。调用System.gc()会显著的影响系统性能,必须彻底的杜绝。