欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解jvm中的引用類型

 更新時(shí)間:2024年04月24日 12:02:21   作者:一只特立獨(dú)行的豬611  
在Java中對(duì)象以引用來指向JVM的內(nèi)存區(qū)塊,這里我們總結(jié)了強(qiáng)引用、軟引用、弱引用和假象引用(幽靈引用),下面這篇文章主要給大家介紹了關(guān)于jvm中引用類型的相關(guān)資料,需要的朋友可以參考下

1.強(qiáng)引用

 一個(gè)對(duì)象A被局部變量、靜態(tài)變量引用了就產(chǎn)生了強(qiáng)引用。因?yàn)榫植孔兞?、靜態(tài)變量都是被GC Root對(duì)象關(guān)聯(lián)上的,所以被引用的對(duì)象A,就在GC Root的引用鏈上了。只要這一層關(guān)系存在,對(duì)象A就不會(huì)被垃圾回收器回收。所以只要方法不退出,局部變量就會(huì)保存當(dāng)前對(duì)象A的地址,該對(duì)象就不會(huì)被回收。

    public static void main(String[] args) {
        ArrayList<Object> objects = new ArrayList<>();

        while (true) {
            //以下兩行代碼產(chǎn)生了兩個(gè)引用關(guān)系,1.bytes變量 到 new byte[1024 * 1024]; 這個(gè)字節(jié)數(shù)組的引用關(guān)系,這也是一個(gè)強(qiáng)引用
            byte[] bytes = new byte[1024 * 1024];
            //2. objects集合對(duì)象 到 字節(jié)數(shù)組的關(guān)系,也是強(qiáng)引用
            objects.add(bytes);
            //每一輪while循環(huán)結(jié)束后,第一個(gè)引用關(guān)系就斷開了。
            //但第二個(gè)引用關(guān)系沒有斷開!所以 bytes數(shù)組1mb大小的內(nèi)存空間是不會(huì)被回收的。
            //這樣就會(huì)導(dǎo)致每輪循環(huán)內(nèi)存中增加1mb的數(shù)據(jù),而且不能被回收
        }
    }

最后一次垃圾回收:回收前7873k,回收后7831k。回收前后內(nèi)存差不多。說明有大量強(qiáng)引用在,而強(qiáng)引用不能被回收。最終內(nèi)存不夠用而報(bào)錯(cuò)。

2.軟引用

由于軟引用允許垃圾回收器在內(nèi)存不足時(shí)回收對(duì)象。所以軟引用放的對(duì)象一般都不是很重要的對(duì)象,否則內(nèi)存不足時(shí),這個(gè)對(duì)象一被回收,某些核心數(shù)據(jù)就沒了。主要應(yīng)用場(chǎng)景在緩存里面。

    public static void main(String[] args) {
        ArrayList<SoftReference> objects = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            byte[] bytes = new byte[1024 * 1024];
            //軟引用
            SoftReference<byte[]> softReference = new SoftReference<>(bytes);
            //將軟引用對(duì)象放入集合中
            objects.add(softReference);
            System.out.println(i);
        }
        for (SoftReference softReference : objects) {//打印一下沒有被回收的軟引用
            System.out.println(softReference.get());
        }
    }

注:這里設(shè)置了堆內(nèi)存10mb(由于還要其他強(qiáng)引用占用空間,所以存不下10個(gè)1mb的字節(jié)數(shù)組),且打印垃圾回收日志

說明:可以看到前七次沒有進(jìn)行垃圾回收,在到下標(biāo)為6時(shí),進(jìn)行垃圾回收,這個(gè)時(shí)候就會(huì)把所有軟引用對(duì)象全部回收,前七個(gè)對(duì)象沒有了。最后再放入7-9三個(gè)字節(jié)數(shù)組對(duì)象。

最終打印集合:前七個(gè)為null(被回收了),只有后三個(gè)了。

注:這種機(jī)制很適合緩存,因?yàn)榫退憔彺嬷熊浺玫臄?shù)據(jù)因?yàn)閮?nèi)存不足被回收了,也可以去數(shù)據(jù)庫中查詢數(shù)據(jù)。

3.弱引用

弱引用的生命周期比軟引用更短,無論內(nèi)存是否充足,只要垃圾回收器開始工作,弱引用關(guān)聯(lián)的對(duì)象都會(huì)被回收。弱引用適用于實(shí)現(xiàn)可以隨時(shí)被回收的緩存數(shù)據(jù),因?yàn)樗皇軆?nèi)存狀況的影響。

null
null
null
null
null
null
null
null
null
[B@4eec7777

進(jìn)程已結(jié)束,退出代碼0

執(zhí)行結(jié)果:前九個(gè)為空,最后一個(gè)由于強(qiáng)引用存在,沒有被回收。

4.虛引用

虛引用是最弱的一種引用關(guān)系,如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒有任何引用一樣,它隨時(shí)可能會(huì)被回收,在 JDK1.2 之后,用 PhantomReference 類來表示,通過查看這個(gè)類的源碼,發(fā)現(xiàn)它只有一個(gè)構(gòu)造函數(shù)和一個(gè) get() 方法,而且它的 get() 方法僅僅是返回一個(gè)null,也就是說將永遠(yuǎn)無法通過虛引用來獲取對(duì)象,虛引用必須要和 ReferenceQueue 引用隊(duì)列一起使用。

如果一個(gè)對(duì)象只具有虛引用,那么它就和沒有任何引用一樣,隨時(shí)會(huì)被JVM當(dāng)作垃圾進(jìn)行GC。

附:引用類型與內(nèi)存管理

了解引用類型對(duì)于正確管理內(nèi)存至關(guān)重要。雖然Java具有自動(dòng)內(nèi)存管理機(jī)制,但如果不正確使用引用類型,仍然可能會(huì)導(dǎo)致內(nèi)存泄漏或者內(nèi)存溢出等問題。以下是一些注意事項(xiàng):

避免過多使用強(qiáng)引用:過多的強(qiáng)引用可能會(huì)導(dǎo)致內(nèi)存占用過高,因此應(yīng)盡量使用弱引用或軟引用來管理對(duì)象。

及時(shí)釋放不再需要的引用:當(dāng)對(duì)象不再需要時(shí),應(yīng)及時(shí)釋放其引用,以便垃圾回收器可以回收對(duì)象并釋放內(nèi)存。

注意循環(huán)引用:循環(huán)引用可能導(dǎo)致對(duì)象無法被回收,從而造成內(nèi)存泄漏。在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí),應(yīng)特別注意避免出現(xiàn)循環(huán)引用。

總結(jié)

到此這篇關(guān)于jvm中引用類型的文章就介紹到這了,更多相關(guān)jvm引用類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

最新評(píng)論