首頁技術(shù)文章正文

Java中強引用、軟引用、弱引用和虛引用分別是什么?[java培訓(xùn)]

更新時間:2020-03-15 來源:黑馬程序員 瀏覽量:

什么是java四大引用?

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

等級: 強 > 軟 > 弱 > 虛

java中的引用


它們有什么作用?

·靈活的控制對象的生命周期

·提高對象的回收機率

理論加代碼分析:

1、什么是強引用

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

代碼

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

2. 什么是軟引用
對象具備軟引用,請記住,只要內(nèi)存足夠,我們不對對象回收,但是當(dāng)內(nèi)存不足,gc對軟引用對象進行回收可以看出軟引用對內(nèi)存很敏感,可用來高速緩存,同時它可以結(jié)合隊列使用,如果軟引用被gc回收,jvm就會把軟引用加入到隊列中。

代碼


public class Demo {
    public static void main(String[] args) {
        String ss = "hello";
        //這時"hello"有一個強引用, 還有一個軟引用
        //泛型指的是軟引用指向的類型
        //軟引用是內(nèi)存不足時,對象被回收
        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不內(nèi)存是發(fā)現(xiàn)弱引用,就會立刻回收弱引用對象,但是我們知道gc是一個優(yōu)先級很低的線程,所以不一定立刻發(fā)現(xiàn)并回收弱引用對象,但記住,只要被gc發(fā)現(xiàn)弱引用,不管內(nèi)存夠不夠,直接回收,同時,弱引用,也可以結(jié)合隊列使用,當(dāng)被回收,就進去于之關(guān)聯(lián)的隊列中。

代碼

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("現(xiàn)在的引用 " + 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類表示。如果一個對象與虛引用關(guān)聯(lián),則跟沒有引用與之關(guān)聯(lián)一樣,在任何時候都可能被垃圾回收器回收。

要注意的是,虛引用必須和引用隊列關(guān)聯(lián)使用,當(dāng)垃圾回收器準(zhǔn)備回收一個對象時,如果發(fā)現(xiàn)它還有虛引用,就會把這個虛引用加入到與之 關(guān)聯(lián)的引用隊列中。程序可以通過判斷引用隊列中是否已經(jīng)加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個虛引用已經(jīng)被加入到引用隊列,那么就可以在所引用的對象的內(nèi)存被回收之前采取必要的行動。

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>(newString("hello"), queue);
        System.out.println(pr.get());
       }

分享到:
在線咨詢 我要報名
和我們在線交談!