最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中對(duì)象的強(qiáng)、軟、弱、虛四種引用詳解

 更新時(shí)間:2023年09月26日 10:33:40   作者:回家放羊吧  
這篇文章主要介紹了java中對(duì)象的強(qiáng)、軟、弱、虛四種引用詳解,對(duì)象的引用分為4種,分別是強(qiáng)引用>軟引用>弱引用>虛引用,程序員可以通過(guò)不同的引用控制對(duì)象的生命周期,方便垃圾回收,使程序更加靈活的控制對(duì)象生命周期,需要的朋友可以參考下

介紹

java垃圾回收機(jī)制通過(guò)兩種方法來(lái)判斷對(duì)象是否回收,分別是引用計(jì)數(shù)法可達(dá)性分析算法

java在jdk1.2之前,只存在一種引用,當(dāng)對(duì)象只有被引用時(shí)才會(huì)存在,當(dāng)沒(méi)有引用時(shí),引用計(jì)數(shù)為0,對(duì)象就會(huì)被垃圾回收判斷為失效,進(jìn)行回收

java在jdk1.2開(kāi)始,對(duì)象的引用分為4種,分別是強(qiáng)引用>軟引用>弱引用>虛引用,程序員可以通過(guò)不同的引用控制對(duì)象的生命周期,方便垃圾回收,使程序更加靈活的控制對(duì)象生命周期

java在jdk1.2開(kāi)始,在java.lang.ref提供了一個(gè)抽象類Reference和三個(gè)實(shí)現(xiàn)類SoftReference(軟引用)、WeakReference(弱引用)、PhantomReference(虛引用

強(qiáng)引用

/**
     * 強(qiáng)引用
     */
    public void testStrongReference(){
        //強(qiáng)引用
        Object obj=new Object();
    }

業(yè)務(wù)代碼中的對(duì)象,絕大部分都是強(qiáng)引用,比如Object obj=new Object(),這種引用的對(duì)象絕對(duì)不會(huì)被垃圾回收,當(dāng)內(nèi)存不足以分配創(chuàng)建對(duì)象的內(nèi)存時(shí),Java虛擬機(jī)會(huì)拋出OOM錯(cuò)誤,使程序異常終止,也不回收這種對(duì)象,只有這個(gè)引用消失后(* 顯式賦值為null*,方法生命周期結(jié)束等),引用計(jì)數(shù)為0,才會(huì)被垃圾回收

軟引用

/**
     * 軟引用
     */
    public void testSoftReference(){
        //強(qiáng)引用
        Object obj=new Object();
        //放入SoftReference
        SoftReference<Object> softReference = new SoftReference<Object>(obj);
        System.out.println( softReference.get());//java.lang.Object@39a054a5
    }

軟引用要比強(qiáng)引用低一個(gè)等級(jí),用來(lái)表示有用非必要的對(duì)象,只有當(dāng)內(nèi)存不足的時(shí)候,才會(huì)對(duì)軟引用對(duì)象進(jìn)行垃圾回收,可以來(lái)實(shí)現(xiàn)緩存,不用擔(dān)心存在內(nèi)存溢出問(wèn)題。

/**
     * 軟引用(引用隊(duì)列)
     */
    public void testSoftReferenceQueue(){
        //引用隊(duì)列
        ReferenceQueue referenceQueue = new ReferenceQueue<>();
        //使用守護(hù)線程
        Thread thread= new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    int i=0;
                    SoftReference<Integer> softReference;
                    //如果對(duì)象被gc回收
                    while((softReference = (SoftReference) referenceQueue.remove()) != null) {
                        System.out.println("第"+i+"次回收:"+softReference);
                        i++;
                    }
                }catch (Exception e){
                }
            }
        });
        thread.setDaemon(true);//設(shè)置為守護(hù)線程,監(jiān)聽(tīng)對(duì)象變化
        thread.start();
        Map<Object, Object> map = new HashMap<>();
        Object obj=new Object();
        for(int i=0;i<2000; i++){
            //放入SoftReference轉(zhuǎn)為軟引用
            byte [] bytes=new byte[1024*1024];
            SoftReference<byte []> softReference = new SoftReference<byte []>(bytes,referenceQueue);
            //將軟引用作為key
            map.put(softReference,obj);
        }
    }

第1992次回收:java.lang.ref.SoftReference@7c7a06ec 第1993次回收:java.lang.ref.SoftReference@1d296da 第1994次回收:java.lang.ref.SoftReference@776aec5c [GC (Allocation Failure) [PSYoungGen: 30K->64K(1536K)] 3833K->3866K(5632K), 0.0002270 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC (Allocation Failure) [PSYoungGen: 64K->64K(1536K)] 3866K->3866K(5632K), 0.0002042 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (Allocation Failure) [PSYoungGen: 64K->0K(1536K)] [ParOldGen: 3802K->3802K(4096K)] 3866K->3802K(5632K), [Metaspace: 3120K->3120K(1056768K)], 0.0019695 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] 3802K->3802K(5632K), 0.0002220 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] [ParOldGen: 3802K->730K(4096K)] 3802K->730K(5632K), [Metaspace: 3120K->3120K(1056768K)], 0.0025588 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 第1995次回收:java.lang.ref.SoftReference@408d971b 第1996次回收:java.lang.ref.SoftReference@75d4a5c2 第1997次回收:java.lang.ref.SoftReference@557caf28

軟引用通過(guò)SoftReference來(lái)進(jìn)行實(shí)現(xiàn),可以將軟引用對(duì)象注冊(cè)到引用隊(duì)列(Referencequeue)中,引用隊(duì)列來(lái)判斷對(duì)象是否被釋放,Reference存在next字段,有四種狀態(tài),可以根據(jù)狀態(tài)判斷,但next僅在放到queue中才會(huì)有意義( 因?yàn)?,只有在enqueue的時(shí)候,會(huì)將next設(shè)置為下一個(gè)要處理的Reference對(duì)象 )

  • active:內(nèi)存被分配的時(shí)候狀態(tài)。
  • pending:即將回收內(nèi)存,存入關(guān)聯(lián)的引用queue中時(shí)的狀態(tài)。
  • Enqueued:內(nèi)存被回收的時(shí)候,進(jìn)入引用隊(duì)列中的狀態(tài)。
  • Inactive:不活躍狀態(tài)。

弱引用

/**
     * 弱引用
     */
    public void testWeakReference(){
        //強(qiáng)引用
        Object obj=new Object();
        //放入WeakReference
        WeakReference<Object> weakReference = new WeakReference<Object>(obj);
        System.out.println(weakReference.get());//java.lang.Object@39a054a5
    }

弱引用要比軟引用第一個(gè)等級(jí),用來(lái)表示非必要的對(duì)象,不管內(nèi)存是否充足,都會(huì)垃圾回收其對(duì)象,但是因?yàn)槔厥站€程優(yōu)先級(jí)很低,所以不會(huì)很快回收 弱引用通過(guò)WeakReference來(lái)進(jìn)行實(shí)現(xiàn),可以將弱引用對(duì)象注冊(cè)到引用隊(duì)列(Referencequeue)中,引用隊(duì)列來(lái)判斷對(duì)象是否被釋放。小伙伴們?nèi)绻霚y(cè)試,可以用上面弱引用的線程監(jiān)聽(tīng)方法

虛引用

/**
     * 虛引用
     */
    public void testPhantomReference(){
        //強(qiáng)引用
        Object obj=new Object();
        //必須使用引用隊(duì)列
        ReferenceQueue referenceQueue = new ReferenceQueue();
        //放入PhantomReference
        PhantomReference<Object> phantomReference = new PhantomReference<Object>(obj,referenceQueue);
        System.out.println(phantomReference.get());//null 因?yàn)樘撘脽o(wú)法獲取對(duì)象實(shí)例,只是監(jiān)聽(tīng)作用
        System.out.println(obj);//java.lang.Object@39a054a5
    }

虛引用相較于其他引用,就如形同虛設(shè),無(wú)法通過(guò)虛引用來(lái)獲取對(duì)象實(shí)例,如果一個(gè)對(duì)象僅僅被虛引用持有,則隨時(shí)會(huì)被垃圾回收,和軟引用、弱引用不同,其必須注冊(cè)到Referencequeue中,當(dāng)對(duì)象即將被回收時(shí),就會(huì)將虛引用放入到引用隊(duì)列中,通過(guò)判斷虛引用是否加入到引用隊(duì)列來(lái)判斷對(duì)象是否要被回收

到此這篇關(guān)于java中對(duì)象的強(qiáng)、軟、弱、虛四種引用詳解的文章就介紹到這了,更多相關(guān)java對(duì)象四種引用詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java元素排序Comparable與Comparator的區(qū)別

    Java元素排序Comparable與Comparator的區(qū)別

    這篇文章主要介紹了Java元素排序Comparable與Comparator的區(qū)別,二者都是頂級(jí)的接口,但擁有的方法和用法是不同的,下面我們分別來(lái)看看具體是怎樣的區(qū)別吧
    2022-05-05
  • Spring Boot優(yōu)雅地處理404異常問(wèn)題

    Spring Boot優(yōu)雅地處理404異常問(wèn)題

    這篇文章主要介紹了Spring Boot優(yōu)雅地處理404異常問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java lambda 循環(huán)累加求和代碼

    Java lambda 循環(huán)累加求和代碼

    這篇文章主要介紹了Java lambda 循環(huán)累加求和代碼,具有很的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Spring Cloud 的 Hystrix.功能及實(shí)踐詳解

    Spring Cloud 的 Hystrix.功能及實(shí)踐詳解

    這篇文章主要介紹了Spring Cloud 的 Hystrix.功能及實(shí)踐詳解,Hystrix 具備服務(wù)降級(jí)、服務(wù)熔斷、線程和信號(hào)隔離、請(qǐng)求緩存、請(qǐng)求合并以及服務(wù)監(jiān)控等強(qiáng)大功能,需要的朋友可以參考下
    2019-07-07
  • 詳解Java編程中對(duì)線程的中斷處理

    詳解Java編程中對(duì)線程的中斷處理

    這篇文章主要介紹了Java編程中對(duì)線程的中斷處理,特別講解了中斷的時(shí)機(jī)與中斷狀態(tài)的管理,需要的朋友可以參考下
    2015-11-11
  • Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送

    Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送

    這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送的相關(guān)資料,實(shí)例講解了java郵件發(fā)送實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 詳解Java虛擬機(jī)管理的內(nèi)存運(yùn)行時(shí)數(shù)據(jù)區(qū)域

    詳解Java虛擬機(jī)管理的內(nèi)存運(yùn)行時(shí)數(shù)據(jù)區(qū)域

    這篇文章主要介紹了詳解Java虛擬機(jī)管理的內(nèi)存運(yùn)行時(shí)數(shù)據(jù)區(qū)域的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Redis應(yīng)用問(wèn)題及分布式鎖使用說(shuō)明

    Redis應(yīng)用問(wèn)題及分布式鎖使用說(shuō)明

    文章主要討論了緩存穿透、緩存雪崩和分布式鎖在高并發(fā)場(chǎng)景下的解決方案,包括對(duì)空值緩存、設(shè)置白名單、布隆過(guò)濾器監(jiān)控、預(yù)先設(shè)置熱門數(shù)據(jù)、實(shí)時(shí)調(diào)整過(guò)期時(shí)間、使用鎖機(jī)制以及構(gòu)建多級(jí)緩存架構(gòu)等
    2026-03-03
  • SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式

    SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式

    這篇文章主要介紹了SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 使用Zxing實(shí)現(xiàn)二維碼生成器內(nèi)嵌圖片

    使用Zxing實(shí)現(xiàn)二維碼生成器內(nèi)嵌圖片

    二維碼在現(xiàn)實(shí)中的應(yīng)用已經(jīng)很廣泛了,本文介紹了使用Zxing實(shí)現(xiàn)二維碼生成器內(nèi)嵌圖片,有需要的可以了解一下。
    2016-10-10

最新評(píng)論

交口县| 抚松县| 会同县| 寿阳县| 汉寿县| 大邑县| 舟曲县| 娄底市| 临海市| 天津市| 贡嘎县| 上饶市| 安岳县| 巴马| 随州市| 巴塘县| 崇义县| 江川县| 阿坝县| 鄢陵县| 临安市| 乌兰县| 彰武县| 定州市| 陇南市| 宜宾市| 泗阳县| 资阳市| 英吉沙县| 万州区| 武乡县| 婺源县| 彭州市| 包头市| 泗阳县| 越西县| 南郑县| 旬阳县| 襄垣县| 四平市| 嘉祥县|