java強(qiáng)、弱、軟、虛引用

public class QuoteTest {
    public static void main(String[] args) {
    /*================================*/
    ///////////////////////////////////////////////////////////////////////////
    // 如果一個(gè)對象具有強(qiáng)引用,那就類似于必不可少的生活用品,垃圾回收器絕不會(huì)回收它,當(dāng)內(nèi)存空間不足,
    //Java虛擬機(jī)寧愿拋出outofMermoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對象來解決內(nèi)存不足問題
    //
    ///////////////////////////////////////////////////////////////////////////

    /*在heap堆中創(chuàng)建新的Object對象通過obj引用這個(gè)對象,第二句是通過obj建立o1到new Object()這個(gè)heap堆中的對象的引用
    *這兩個(gè)引用都是強(qiáng)引用,只要存在heap中對象的引用,gc就不會(huì)收集該對象
    */
    Object obj = new Object();

    Object o1 = obj;

    obj = null;
    o1 = null;

    //對象屬于那種可及的對象,由它的最強(qiáng)的引用決定
    String abc = new String("abc");

    SoftReference<String> abcSoftRef = new SoftReference<String>(abc);//軟引用

    WeakReference<String> abcWeakRef = new WeakReference<String>(abc);//弱引用

    abc = null;//執(zhí)行這行代碼的時(shí)候?qū)ο蟛辉偈菑?qiáng)可及,變成軟可及的。

    abcSoftRef = null;//對象變成弱可及

//  weakTemp();

    test();

    }
    public static void softTemp() {
       A a = new A();
       SoftReference<A> aSoftRef = new SoftReference<>(a);

      if (aSoftRef != null) {
          a = aSoftRef.get();
       } else {
         a = new A();
        aSoftRef = new SoftReference<A>(a);
      }
    }
    ///////////////////////////////////////////////////////////////////////////
    // 弱引用于軟引用的區(qū)別在于,只具有弱引用的對象擁有跟短暫的生命周. 期,在垃圾回收器線程掃描
    // ,一旦發(fā)現(xiàn)持有了弱引用的對象,不管當(dāng)前內(nèi)存空間足夠與否,他都會(huì)回收它的內(nèi)存
    // 弱引用可以和一個(gè)引用隊(duì)列聯(lián)合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機(jī)就會(huì)吧
    // 弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列當(dāng)中
    ///////////////////////////////////////////////////////////////////////////
   public static void weakTemp() {
      String abc = new String("abc");
      WeakReference<String> abcWeakRef = new WeakReference<>(abc);
      abc = null;

      System.out.println("before gc:" + abcWeakRef.get());
      System.gc();

      System.out.println("after gc :" + abcWeakRef.get());
    }
      public static boolean isRunning = true;


      ///////////////////////////////////////////////////////////////////////////
      // 虛引用 必須和引用隊(duì)列關(guān)聯(lián)使用
      ///////////////////////////////////////////////////////////////////////////
  public static void test() {
      String abc = new String("abc");
       System.out.println(abc.getClass() + " @" + abc.hashCode());

      final ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
      new Thread() {
          public void run() {
            while (isRunning) {
                Object poll = referenceQueue.poll();
                if (poll != null) {
                    try {
                        Field rereferent = Reference.class.getDeclaredField("referent");
                        rereferent.setAccessible(true);
                        Object result = rereferent.get(poll);
                        System.out.println("gc will  collect:" + result.getClass() + " @" + result.hashCode());
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }

                }
            }
        }
    }.start();

    PhantomReference<String> abcPhRef = new PhantomReference<>(abc, referenceQueue);
    abc = null;
    try {

        Thread.currentThread().sleep(3000);
        System.gc();
        Thread.currentThread().sleep(3000);
        isRunning = false;
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

  }


   public static class A {}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容