🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### JAVA引用分类 * 强引用\(StrongReference\):强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它 * 软引用\(SoftReference\):软引用的特点是内存足够的时候,gc的时候不会回收它,只有内存不足的时候才会回收软引用的对象 * 弱引用\(WeakReference\):在垃圾回收器扫描的时候,发现弱引用会把它放到ReferenceQueue中,等下次gc的时候会回收它 系统为我们提供了WeakHashMap,和HashMap类似,只是其key使用了weak reference。如果WeakHashMap的某个key被垃圾回收器回收,那么entity也会自动被remove * 虚引用\(PhantomReference\):虚引用顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动;虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列ReferenceQueue联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中; ![](../assets/20180622174848001.png) **SoftReference**\(软引用\) 软引用是主要用于内存敏感的高速缓存。在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内存溢出。什么时候会被收集取决于gc的算法和gc运行时可用内存的大小。当gc决定要收集软引用是执行以下过程,以上面的abcSoftRef为例: * 首先将abcSoftRef的referent设置为null,不再引用heap中的new String\("abc"\)对象。 * 将heap中的new String\("abc"\)对象设置为可结束的\(finalizable\)。 * 当heap中的new String\("abc"\)对象的finalize\(\)方法被运行而且该对象占用的内存被释放, abcSoftRef被添加到它的ReferenceQueue中。 注:对ReferenceQueue软引用和弱引用可以有可无,但是虚引用必须有 ``` String abc=new String("abc"); //1 SoftReference<String> abcSoftRef=new SoftReference<String>(abc); //2 WeakReference<String> abcWeakRef = new WeakReference<String>(abc); //3 abc=null; //4 abcSoftRef.clear();//5 ``` ![](../assets/20180622175353001.png) 【知识总结】 * 当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收 * 要使用这些特殊的引用类,就不能保留对对象的强引用,如果保留了对对象的强引用,就会浪费这些引用类所提供的任何好处