强引用,软引用,弱引用,虚引用



          我们开发中如果没有做性能上的优化则经常会遇到OOM的情况,而适当的使用软引用和弱引用则可以一定程度上解决一些OOM的问题。


       下面我们先来看看java中的四种引用:

       1.强引用(StrongReference):我们平常的A a=new A();就是属于强引用,强引用的情况下,无论如何都不会被JVM回收内存,然后这种强引用多了之后,当内存满了之后,显然会出现OOM.


       2.软引用(SoftReference):软引用关联着的对象只有当内存不足的时候JVM才会回收这个对象的内存,即可用来描述一些有用但不是必需的对象,很适合用来做一些内存缓存,比如缓存图片,数据等。这样当内存足够的时候就会保存这些缓存,只有当内存不足的时候才会回收这些缓存。

       SoftReference<String> sr = new SoftReference<String>(new String("helloworld"));


   3.弱应用(WeakReference):这个也是用来描述一些非必须的对象,但是他的关联程度比软引用还要弱一点,就是无论当前内存是否不足,一旦执行GC,那么他就会被回收。

      WeakReference<String> sr = new WeakReference<String>(new String("helloworld"));


   4.虚引用(PhantomReference):它并不影响对象的生命周期。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。



      由上面可以看出软引用和弱引用可以使我们的对象具备有一定的生命周期,这样在我们内存不足的时候导致他可以被回收,显然这可以一定程度上避免OOM的发生,而这种情形对一些数据的缓存又十分适用,比如对图片的缓存,显然在内存里对图片的缓存是必要的,这样对图片的加载速度上是一个很大的提高,但是图片同时又是很占内存的,如果我们让图片对象是强引用关联的话,那很容易产生OOM,所以我们应当把图片对象与软应用关联,这样既可以缓存图片,又可以在内存不足的时候回收内存。

    

你可能感兴趣的:(弱引用,软引用,强引用,虚引用)