国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java四種引用類型

chuyao / 2141人閱讀

摘要:四種引用類型在中,類型就分為兩種,基本類型和引用類型或自定義類型。軟引用可用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存。一般用法是程序可以通過判斷引用隊(duì)列中是否已經(jīng)加入了虛引用,來了解被引用的對(duì)象是否將要被垃圾回收。

Java四種引用類型

在java中,類型就分為兩種,基本類型和引用類型或自定義類型。

引用類型又分為四種:

強(qiáng)引用 StrongReference

軟引用 SoftReference

若引用 WeakReference

虛引用 PhantomReference

劃分這些類型的目的是:是為了更靈活的管理對(duì)象的生命周期,讓垃圾器在最合適的時(shí)間適合回收對(duì)象,常見使用的場(chǎng)景是在緩存的實(shí)現(xiàn),比如elasticsearch在載入數(shù)據(jù)到緩存時(shí),可以選擇SoftReference作為緩存的生命周期,在對(duì)象池組件common-pool中也利用到SoftReference管理對(duì)象池的對(duì)象生命周期。雖然,我們?cè)趯?shí)際業(yè)務(wù)中很少有用到這些知識(shí),但是很有必要了解到這些,去幫助我們?nèi)プ鲂┏绦蛐阅軆?yōu)化。

強(qiáng)引用

強(qiáng)引用就是直接引用對(duì)象比如下面這樣,我們?cè)诰帉懗绦驎r(shí),用到的大多都是強(qiáng)引用

StringBuffer b1 = new StringBuffer("hello world");

強(qiáng)引用對(duì)象,當(dāng)垃圾回收進(jìn)行時(shí),不會(huì)被回收,及時(shí)通過b1 = null;釋放引用,在資源充足時(shí),也不會(huì)被垃圾回收立刻回收。如果內(nèi)存吃緊,Java虛擬機(jī)會(huì)拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來解決內(nèi)存不足的問題。

軟引用
SoftReference softReference = new SoftReference(new StringBuffer("hello world"));
System.gc();
System.out.print(softReference.get()); // 只有當(dāng)內(nèi)存吃緊時(shí),發(fā)生gc后,會(huì)報(bào)Exception in thread "main" java.lang.NullPointerException,

軟引用的生命周期會(huì)比強(qiáng)引用弱點(diǎn),在內(nèi)存空間足夠時(shí),垃圾回收器就不會(huì)回收它;如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存。只要垃圾回收器沒有回收它,該對(duì)象就可以被程序使用。軟引用可用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存。
它也經(jīng)常和ReferenceQueue配合使用,如果gc在回收掉引用對(duì)象后,會(huì)把保存引用對(duì)象的softReference送入隊(duì)列,這時(shí)可以通過下面這行代碼判斷是否被回收。

// 創(chuàng)建softReference并提供給注冊(cè)隊(duì)列
ReferenceQueue referenceQueue = new ReferenceQueue();
SoftReference softReference = new SoftReference(new StringBuffer("hello world"),referenceQueue);

// 判斷入隊(duì)列來判斷是否被回收,或直接判斷softReference.get() == null
softReference.get() == null || softReference.enqueue()   

另外也可以手動(dòng)清除這些保存引用對(duì)象的reference對(duì)象

Reference ref;
while ((ref = referenceQueue.poll()) != null) {
    // poll出即清除,也不必手動(dòng)清除,等待gc清除
}

使用案列:common-pool2的SoftReferenceObjectPool,用于實(shí)現(xiàn)一種可以隨著需要而增長的池對(duì)象管理,當(dāng)gc時(shí)可以清除空閑的實(shí)例。

下面是common-pool2的部分代碼,具體可以參照其里面的SoftReferenceObjectPool

@Override
public synchronized void addObject() throws Exception {
    assertOpen();
    if (factory == null) {
        throw new IllegalStateException(
                "Cannot add objects without a factory.");
    }
    T obj = factory.makeObject().getObject();
    createCount++;
    // Create and register with the queue
    PooledSoftReference ref = new PooledSoftReference(
            new SoftReference(obj, refQueue));
    allReferences.add(ref);
    boolean success = true;
    if (!factory.validateObject(ref)) {
        success = false;
    } else {
        factory.passivateObject(ref);
    }
    boolean shouldDestroy = !success;
    if (success) {
        idleReferences.add(ref);
        notifyAll(); // numActive has changed
    }
    if (shouldDestroy) {
        try {
            destroy(ref);
        } catch (Exception e) {
            // ignored
        }
    }
    
    @Override
    public synchronized void returnObject(T obj) throws Exception {
        boolean success = !isClosed();
        final PooledSoftReference ref = findReference(obj);
        if (ref == null) {
            throw new IllegalStateException(
                "Returned object not currently part of this pool");
        }
        if (factory != null) {
            if (!factory.validateObject(ref)) {
                success = false;
            } else {
                try {
                    factory.passivateObject(ref);
                } catch (Exception e) {
                    success = false;
                }
            }
        }
        boolean shouldDestroy = !success;
        numActive--;
        if (success) {
            // Deallocate and add to the idle instance pool
            ref.deallocate();
            idleReferences.add(ref);
        }
        notifyAll(); // numActive has changed
        if (shouldDestroy && factory != null) {
            try {
                destroy(ref);
            } catch (Exception e) {
                // ignored
            }
        }
    }

弱引用
WeakReference weakReference = new WeakReference(new StringBuffer("hello world"));
WeakReference weakReference2 = new WeakReference(new StringBuffer("hello world"));
System.out.print(weakReference.get()); //  hello world
StringBuffer buffer = weakReference2.get();
System.gc();
System.out.print(weakReference.get()); // Exception in thread "main" java.lang.NullPointerException
System.out.print(weakReference2.get()); //  hello world

弱引用會(huì)在發(fā)生gc時(shí),沒有對(duì)象在去引用時(shí)會(huì)被立刻被回收,不管內(nèi)存是否充裕。

使用案列:WeakHashMap

虛引用
ReferenceQueue stringBufferReferenceQueue = new ReferenceQueue();
PhantomReference phantomReference = new PhantomReference(new StringBuffer("hello world"), stringBufferReferenceQueue);
System.out.print(phantomReference.get());Exception in thread "main" java.lang.NullPointerException

虛引用,不顧是否被垃圾回收,都不可以拿到真正的引用對(duì)象。一般用法是
程序可以通過判斷引用隊(duì)列中是否已經(jīng)加入了虛引用,來了解被引用的對(duì)象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)。

具體Demo代碼請(qǐng)參照:ReferenceDemo

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64719.html

相關(guān)文章

  • Java中的四種引用(強(qiáng)引用、軟引用、弱引用、虛引用

    摘要:在之后,對(duì)引用的概念進(jìn)行了擴(kuò)充,將引用分為強(qiáng)引用軟引用弱引用虛引用種,這種引用強(qiáng)度依次逐漸減弱。軟引用是用來描述一些還有用但并非必需的對(duì)象。虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關(guān)系。 以下內(nèi)容摘自《深入理解Java虛擬機(jī) JVM高級(jí)特性與最佳實(shí)踐》第2版,強(qiáng)烈推薦沒有看過的同學(xué)閱讀,讀完的感覺就是原來學(xué)的都是些什么瘠薄東西(╯‵□′)╯︵┴─┴ 在JDK1.2以前,Ja...

    wwolf 評(píng)論0 收藏0
  • java當(dāng)中的四種引用

    摘要:如果想中斷強(qiáng)引用和某個(gè)對(duì)象之間的關(guān)聯(lián),可以顯式地將引用賦值為,這樣一來的話,在合適的時(shí)間就會(huì)回收該對(duì)象。不過由于垃圾回收器是一個(gè)優(yōu)先級(jí)較低的線程,所以并不一定能迅速發(fā)現(xiàn)弱引用對(duì)象。 強(qiáng)引用,軟引用,弱引用,虛引用。不同的引用類型主要體現(xiàn)在GC上: △強(qiáng)引用:如果一個(gè)對(duì)象具有強(qiáng)引用,它就不會(huì)被垃圾回收器回收。即使當(dāng)前內(nèi)存空間不足,JVM也不會(huì)回收它,而是拋出 OutOfMemoryErr...

    peixn 評(píng)論0 收藏0
  • Java中的四種引用類型:強(qiáng)引用、軟引用、弱引用和虛引用

    摘要:虛引用與軟引用和弱引用的一個(gè)區(qū)別在于虛引用必須和引用隊(duì)列聯(lián)合使用。 本文已同步至個(gè)人博客liaosis blog 在Java中是由JVM負(fù)責(zé)內(nèi)存的分配和回收,這是它的優(yōu)點(diǎn)(簡(jiǎn)化編程者的工作,不需要像C語言那樣去手動(dòng)操作內(nèi)存),但同時(shí)也是它的缺點(diǎn)(不夠靈活,垃圾回收對(duì)于編程者來說是不可控的)。 在JDK1.2以前,如果一個(gè)對(duì)象不被任何變量引用,則程序無法再次使用這個(gè)對(duì)象,這個(gè)對(duì)象最終會(huì)...

    makeFoxPlay 評(píng)論0 收藏0
  • 深入解析強(qiáng)引用、軟引用、弱引用、幻象引用

    摘要:弱引用與軟引用最大的區(qū)別就是弱引用比軟引用的生命周期更短暫。所以對(duì)于軟引用弱引用之類,垃圾收集器可能會(huì)存在二次確認(rèn)的問題,以確保處于弱引用狀態(tài)的對(duì)象沒有改變?yōu)閺?qiáng)引用。 關(guān)于強(qiáng)引用、軟引用、弱引用、幻象引用的區(qū)別,在一些大公司的面試題中經(jīng)常出現(xiàn),可能有些小伙伴覺得這個(gè)知識(shí)點(diǎn)比較冷門,但其實(shí)大家在開發(fā)中經(jīng)常用到,如new一個(gè)對(duì)象的時(shí)候就是強(qiáng)引用的應(yīng)用。 在java語言中,除了原始數(shù)據(jù)類型(...

    Bmob 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<