java中四种引用StrongReference,SoftReference,WeakReference,PhantomReference的理解

    java中有四种引用,它们分别为强引用,软引用,弱引用,虚引用。

    我写这篇博客也是为了让自己再次的理解这四引用,费话不多话,我们先来探讨下这四种引用的作用和特点。

    强引用(StrongReference), 强引用是我们使用的最常用的一种引用。当我们定义的一个对象具有引用,系统的垃圾回收机制不会将这个对象进行回收,就算内存不足时,系统会抛出OutOfMemoryError内存溢出错误导致系统崩溃,也不会回收。

    下面我们举例说明强引用:

        MyClassA  a = new MyClassA(); //定义一个对象a强引用于MyClassA(),只有a=null时,系统才会进行内存回收。

  我们再定义一个对象b, MyClassB b = new MyClassB(a);

       以上对象的的引用关系到底是什么样的,我们可以用图说话。

            java中四种引用StrongReference,SoftReference,WeakReference,PhantomReference的理解_第1张图片

    虽然new MyClassB()对象间接引用了new MyClassA(),但它们之间的关系还是强引用。那这种关系在哪体现呢?

    首先,如果我们将a=null,系统会不会释放掉new MyClassA()的内存空间呢?这里是不会的。因为我们可以看到new MyClassA()还被其他对象所引用,所以不会被垃圾回收机制给回收了。很多人认为只要把a=null后就万事大吉了,所以我们的程序很容易在这种情况之下产生内在泄漏。


    软引用(SoftReference),软引用的一大特点就是如果一个对象具有软引用时,当我们的系统内存足够就不会回收它,但内存不足就会回收它,不像强引用直到系统报错也不会回收。软引用可以配合ReferenceQueue来一起使用,这里就不说了。

        如何使用软件引用:

                SoftReference sRef;    // 这是我们定义的软引用对象

                MyObject obj;   // 定义的普通对象

                obj = sRef.get(); // 从sRef对象不获取对象,可能为空

                if(obj == null){

                    sRef = new SoftReference(new MyObject);

                    obj = sRef.get();    //这是使用软引用初始化对象obj的一种方式,设计非常巧妙

                }

   

    弱引用(WeakReference),特点是当系统找到一个只有弱引用的对象时,系统会直接回收它,所以生命周期很短暂。

            如何使用弱引用:

                MyObject obj = new MyObject(); // 定义一个强引用

                WeakReference wRef = new WeakReference(obj); // 定义一个弱引用

                当我们把obj赋空值obj=null,内存回收机制会把内存回收,这一点与上文中强引用最大的区别。虽然new WeakReference()也引用了new Object(),当obj=null时,对于这个弱引用就不管用了,还是进行内存回收。


    虚引用(PhantomReference),特点是如果一个对象仅持有虚引用,那么它就和没有任何引用一样。


    以上四种引用强引用最常见,其次为弱引用,其他的两种不大常用。


    +_+ @a little a day



你可能感兴趣的:(java,内存泄漏,引用)