溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java中有哪些引用類(lèi)型

發(fā)布時(shí)間:2021-04-13 15:15:28 來(lái)源:億速云 閱讀:156 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

Java中有哪些引用類(lèi)型?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

強(qiáng)引用

強(qiáng)引用是最常用的引用類(lèi)型,如下所示,new Object()會(huì)創(chuàng)建一個(gè)Object對(duì)象并存儲(chǔ)在堆上,變量object存儲(chǔ)對(duì)該對(duì)象的強(qiáng)引用。

Object object = new Object();

強(qiáng)引用不會(huì)被垃圾回收,所以要想回收該對(duì)象,則應(yīng)該將指向該對(duì)象的變量顯示設(shè)為null,這樣該對(duì)象就由強(qiáng)引用轉(zhuǎn)變?yōu)闊o(wú)引用了。

示例:

public class ReferenceDemo {
    public static void main(String[] args) throws IOException {
        //強(qiáng)引用不會(huì)被垃圾回收
        ReferenceDemo referenceDemo = new ReferenceDemo();
        //強(qiáng)引用轉(zhuǎn)變?yōu)闊o(wú)引用,無(wú)引用可被垃圾回收
        referenceDemo = null;
        //觸發(fā)垃圾回收
        System.gc();
        //阻塞主線程,等待垃圾回收線程執(zhí)行
        System.in.read();
    }

    //對(duì)象被回收之前調(diào)用
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("-----finalize-----");
    }
}

軟引用

軟引用是使用SoftReference創(chuàng)建的,在內(nèi)存空間充足的情況下,軟引用不會(huì)被回收,而在內(nèi)存空間不足虛擬機(jī)拋出OutOfMemoryError之前,軟引用將會(huì)被回收。

示例:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //創(chuàng)建ReferenceDemo對(duì)象的軟引用
        SoftReference<ReferenceDemo> softReference = new SoftReference<>(new ReferenceDemo());
        //觸發(fā)垃圾回收
        System.gc();
        //阻塞主線程,等待垃圾回收線程執(zhí)行
        Thread.sleep(5000);
        //softReference.get()返回軟引用對(duì)象,如果對(duì)象已經(jīng)被垃圾回收,則返回null
        System.out.println(softReference.get());

        //創(chuàng)建25M的字節(jié)數(shù)組
        byte[] bytes = new byte[1024 * 1024 * 25];
        //內(nèi)存已經(jīng)不足,阻塞主線程,等待垃圾回收線程執(zhí)行
        Thread.sleep(5000);
        //重新輸出軟引用對(duì)象
        System.out.println(softReference.get());
    }
}

/*
 * 輸出結(jié)果:
 * com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
 * null
 */

注意:示例運(yùn)行前需要設(shè)置堆內(nèi)存大小為30M(-Xmx30m -Xms30m)。

用途:軟引用可以用于對(duì)內(nèi)存空間敏感的緩存,緩存的對(duì)象一直保存,直到內(nèi)存空間不足而被回收。

弱引用

弱引用是使用WeakReference創(chuàng)建的,在垃圾回收線程執(zhí)行過(guò)程中,只要找到了弱引用,不管內(nèi)存空間是否足夠,弱引用對(duì)象都將被回收。由于垃圾回收線程是一個(gè)優(yōu)先級(jí)很低的線程,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。

示例:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //創(chuàng)建ReferenceDemo的弱引用
        WeakReference<ReferenceDemo> weakReference = new WeakReference<>(new ReferenceDemo());
        //weakReference.get()返回弱引用對(duì)象,如果對(duì)象已經(jīng)被垃圾回收,則返回null
        System.out.println(weakReference.get());

        //觸發(fā)垃圾回收
        System.gc();
        //阻塞主線程,等待垃圾回收線程執(zhí)行
        Thread.sleep(3000);

        //重新輸出弱引用對(duì)象
        System.out.println(weakReference.get());
    }
}

/*
 * 輸出結(jié)果:
 * com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
 * null
 */

用途:弱引用也可以用于緩存,可以參考WeakHashMap類(lèi)。

虛引用

虛引用是使用PhantomReference創(chuàng)建的,它是所以引用類(lèi)型中最弱的。虛引用對(duì)象和沒(méi)有引用的對(duì)象相同,可以在任何時(shí)候被垃圾回收,并且虛引用必須要與引用隊(duì)列一起使用。

當(dāng)垃圾回收線程回收一個(gè)虛引用對(duì)象時(shí),它將在垃圾回收后銷(xiāo)毀該對(duì)象,并將PhantomReference添加到引用隊(duì)列中。

示例:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //創(chuàng)建引用隊(duì)列
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
        //創(chuàng)建ReferenceDemo的虛引用
        PhantomReference<ReferenceDemo> phantomReference = new PhantomReference<>(new ReferenceDemo(), referenceQueue);
        //phantomReference.get()總是返回null
        System.out.println("phantomReference.get():" + phantomReference.get());
        //輪詢(xún)此隊(duì)列,查看是否有可用的Reference對(duì)象,有則返回該對(duì)象,否則返回null
        System.out.println("referenceQueue.poll():" + referenceQueue.poll());

        //觸發(fā)垃圾回收
        System.gc();
        //阻塞主線程,等待垃圾回收線程執(zhí)行
        Thread.sleep(3000);
        System.out.println("------垃圾回收之后------");

        System.out.println("phantomReference.get():" + phantomReference.get());
        System.out.println("referenceQueue.poll():" + referenceQueue.poll());
    }
}

/*
 * 輸出結(jié)果:
 * phantomReference.get():null
 * referenceQueue.poll():null
 * ------垃圾回收之后------
 * phantomReference.get():null
 * referenceQueue.poll():java.lang.ref.PhantomReference@76fb509a
 */

關(guān)于Java中有哪些引用類(lèi)型問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI