亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中對象的強、軟、弱、虛四種引用詳解

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

介紹

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

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

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

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

強引用

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

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

軟引用

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

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

/**
     * 軟引用(引用隊列)
     */
    public void testSoftReferenceQueue(){
        //引用隊列
        ReferenceQueue referenceQueue = new ReferenceQueue<>();
        //使用守護(hù)線程
        Thread thread= new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    int i=0;
                    SoftReference<Integer> softReference;
                    //如果對象被gc回收
                    while((softReference = (SoftReference) referenceQueue.remove()) != null) {
                        System.out.println("第"+i+"次回收:"+softReference);
                        i++;
                    }
                }catch (Exception e){
                }
            }
        });
        thread.setDaemon(true);//設(shè)置為守護(hù)線程,監(jiān)聽對象變化
        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

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

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

弱引用

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

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

虛引用

/**
     * 虛引用
     */
    public void testPhantomReference(){
        //強引用
        Object obj=new Object();
        //必須使用引用隊列
        ReferenceQueue referenceQueue = new ReferenceQueue();
        //放入PhantomReference
        PhantomReference<Object> phantomReference = new PhantomReference<Object>(obj,referenceQueue);
        System.out.println(phantomReference.get());//null 因為虛引用無法獲取對象實例,只是監(jiān)聽作用
        System.out.println(obj);//java.lang.Object@39a054a5
    }

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

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

相關(guān)文章

  • springboot默認(rèn)掃描的路徑方式

    springboot默認(rèn)掃描的路徑方式

    這篇文章主要介紹了springboot默認(rèn)掃描的路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 解決找不到符號 符號:變量 log問題

    解決找不到符號 符號:變量 log問題

    這篇文章主要介紹了解決找不到符號 符號: 變量 log問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 如何基于java語言實現(xiàn)八皇后問題

    如何基于java語言實現(xiàn)八皇后問題

    這篇文章主要介紹了如何基于java語言實現(xiàn)八皇后問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • java 接口回調(diào)實例詳解

    java 接口回調(diào)實例詳解

    這篇文章主要介紹了java 接口回調(diào)實例詳解的相關(guān)資料,所謂回調(diào)就是使用java中的多態(tài),需要的朋友可以參考下
    2017-07-07
  • java基本教程之Thread中start()和run()的區(qū)別 java多線程教程

    java基本教程之Thread中start()和run()的區(qū)別 java多線程教程

    這篇文章主要介紹了Thread中start()和run()的區(qū)別,Thread類包含start()和run()方法,它們的區(qū)別是什么?下面將對此作出解答
    2014-01-01
  • Java單例的寫法詳解

    Java單例的寫法詳解

    在java中,單例有很多種寫法,面試時,手寫代碼環(huán)節(jié),除了寫算法題,有時候也會讓手寫單例模式,這里記錄一下單例的幾種寫法和優(yōu)缺點。需要的朋友可以參考下
    2021-09-09
  • Java通過apache poi生成excel實例代碼

    Java通過apache poi生成excel實例代碼

    本篇文章主要介紹了Java通過apache poi生成excel實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Windows系統(tǒng)編寫bat腳本啟動、停止及重啟Java服務(wù)jar包

    Windows系統(tǒng)編寫bat腳本啟動、停止及重啟Java服務(wù)jar包

    在bat文件中我們將編寫一些代碼來運行Java jar文件,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)編寫bat腳本啟動、停止及重啟Java服務(wù)jar包的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Java如何配置IDEA自定義注釋

    Java如何配置IDEA自定義注釋

    在IDEA中設(shè)置自動創(chuàng)建類和方法的注釋可以提高編碼效率,確保代碼的一致性和可讀性,首先,對于創(chuàng)建類的注釋,可以通過修改File→Settings→File and Code Templates→Class的模板來實現(xiàn),其次,對于方法注釋
    2024-10-10
  • springBoot mybatis 包掃描實例

    springBoot mybatis 包掃描實例

    這篇文章主要介紹了springBoot mybatis 包掃描實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論