java基礎丨java中的四大引用

什麼是java四大引用?

是JDK1.2版本開始引入,把對象的引用分爲4個等級,我們平時學習的就是四種的第一級的強 引用,說白了,就Object o = new Object(),四個引用分別是強引用、軟引用、弱引用和 虛引用,請記住它們的順序!因爲這是它們對內存的敏感程度! 等級: 強 > 軟 > 弱 > 虛

它們有什麼作用?

靈活的控制對象的生命週期

提高對象的回收機率

理論加代碼分析

1.什麼是強引用

  • 強引用就是我們平時使用的對象方式,也是使用最多的一種方式,請記住不管內存 緊張也罷,不足也罷,gc永不回收強引用的對象, 即使jvm 出現(內存溢出錯 誤)OutOfMemoryError,使程序停止,也不會回收對象來提高內存
  • 代碼

public class StrongReferenceDemo { 
    public static void main(String[] args) { 
        Integer data = new Integer(4); 
        String str = "123"; 
        Student student = new Student(); 
        //以上三個對象都是強引用對象,指我們平時使用的對象方式
    } 

class Student { 
}

2. 什麼是軟引用

  • 對象具備軟引用,請記住,只要內存足夠,我們不對對象回收,但是當內存不足, gc對軟引用對象進行回收 可以看出軟引用對內存很敏感,可用來高速緩存,同時它 可以結合隊列使用,如果軟引用被gc回收,jvm就會把軟引用加入到隊列中。
  • 代碼

public class Demo { 
    public static void main(String[] args) { 
        String ss = "hello"; 
        //這時"hello"有一個強引用, 還有一個軟引用
        //泛型指的是軟引用指向的類型
        //軟引用是內存不足時,對象被回收
        SoftReference<String> soft = new SoftReference<String>(ss); 
        //獲取軟引用的對象
        String content = soft.get(); 
        System.out.println(content); 
        ss = null; //強引用沒有了,這時只有軟引用指向"hello" 
        System.gc(); //強制回收
        System.gc(); 
        System.gc(); 
        content = soft.get();//看看有沒有被回收
    } 
}

3.什麼是弱引用?

  • gc不內存是發現弱引用,就會立刻回收弱引用對象,但是我們知道gc是一個優先級很 低的線程,所以不一定立刻發現並回收弱引用對象,但記住,只要被gc發現弱引 用,不管內存夠不夠,直接回收,同時,弱引用,也可以結合隊列使用,當被回 收,就進去於之關聯的隊列中
  • 代碼

public class WeakReference { 
    public static void main(String[] args) { 
        String ss = "hello"; 
        ReferenceQueue<String> queue = new ReferenceQueue<>(); 
        java.lang.ref.WeakReference<String> weak = new 
java.lang.ref.WeakReference<String>(ss,queue); 
        System.out.println("現在的引用 " + weak.get()); 
        ss = null; 
        System.gc(); //gc 
        Reference<? extends String> poll = queue.poll(); 
        //如果null,說明被回收了
        if(poll != null) { 
            String content = poll.get(); 
            System.out.println(content); 
        } 
        //看看有沒有被回收
    } 
}

4.什麼是虛引用?

  • 虛引用和前面的軟引用、弱引用不同,它並不影響對象的生命週期。在java中用 java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關聯,則跟沒有引 用與之關聯一樣,在任何時候都可能被垃圾回收器回收。

要注意的是,虛引用必須和引用隊列關聯使用,當垃圾回收器準備回收一個對象 時,如果發現它還有虛引用,就會把這個虛引用加入到與之 關聯的引用隊列中。程序可 以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回 收。如果程序發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內 存被回收之前採取必要的行動。

import java.lang.ref.PhantomReference;   
    import java.lang.ref.ReferenceQueue;   
    public class Main {   
        public static void main(String[] args) {   
            ReferenceQueue<String> queue = new ReferenceQueue<String>();   
            PhantomReference<String> pr = new PhantomReference<String>(new 
String("hello"), queue);   
            System.out.println(pr.get());   
        }   
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章