Java基礎(chǔ)-對(duì)象的引用類型

上一篇 <<<JVM中對(duì)象如何完成空間分配和初始化工作
下一篇 >>>JVM元空間(方法區(qū))和棧內(nèi)存溢出原因及解決方案


強(qiáng)引用

Object o = new Object(); 被引用關(guān)聯(lián)的對(duì)象永遠(yuǎn)不會(huì)被垃圾收集器回收。

QuoteEntity user1 = new QuoteEntity("jarye");
QuoteEntity user2 = user1;
user1 = null;
System.out.println(user2);
System.gc();
System.out.println(user2);
---------------------------------------------------------------
打印結(jié)果:
com.jarye.quote.entity.QuoteEntity@2f410acf
com.jarye.quote.entity.QuoteEntity@2f410acf

軟引用

SoftReference 軟引用關(guān)聯(lián)的對(duì)象,只有當(dāng)系統(tǒng)內(nèi)存溢出時(shí),才會(huì)回收軟引用的對(duì)象。(用來做緩存)

ArrayList<SoftReference<byte[]>> objects = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    SoftReference<byte[]> softReference = new SoftReference<>(new byte[4 * 1024 * 1024]);
    System.out.println("======="+softReference.get());
    objects.add(softReference);
}
System.out.println("打印結(jié)果:");
objects.forEach((t) -> {
    System.out.println("-------------"+t.get());
});

參數(shù)設(shè)置:-Xmx8m -XX:+PrintGCDetails -verbose:gc
響應(yīng)結(jié)果:
=======[B@768debd
=======[B@490d6c15
=======[B@7d4793a8
=======[B@449b2d27
=======[B@5479e3f
=======[B@27082746
=======[B@66133adc
=======[B@7bfcd12c
=======[B@42f30e0a
=======[B@24273305
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------[B@24273305
tips:虛擬機(jī)設(shè)置了8M,由于其他也占用空間,所以最后只存了一個(gè)

弱引用

WearkReference 只能存在于下一次gc之前:發(fā)生minorgc majorgc就會(huì)被回收

QuoteEntity user1 = new QuoteEntity("jarye");
WeakReference<QuoteEntity> weakReference = new WeakReference<QuoteEntity>(user1);
user1 = null;
System.out.println(weakReference.get());
System.gc();
System.out.println(weakReference.get());
---------------------------------------------------------------
打印結(jié)果:
com.jarye.quote.entity.QuoteEntity@2f410acf
null

虛引用

Object o = new Object();
O=null; 提醒我們的gc來回收這個(gè)對(duì)象
tips:基本上沒用,必須要PhantomReference修飾,結(jié)果隨時(shí)可能為空

QuoteEntity user1 = new QuoteEntity("jarye");
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();
PhantomReference<QuoteEntity> phantomReference = new PhantomReference<QuoteEntity>(user1, referenceQueue);
System.out.println(phantomReference.get());
---------------------------------------------------------------
null

tips:軟弱虛對(duì)應(yīng)引用的指針放入到引用隊(duì)列中,實(shí)現(xiàn)清理。


相關(guān)文章鏈接:
<<<Java基礎(chǔ)-反射機(jī)制
<<<Java基礎(chǔ)-字節(jié)碼技術(shù)
<<<Java基礎(chǔ)-創(chuàng)建對(duì)象的方式匯總
<<<Java基礎(chǔ)-對(duì)象布局
<<<Class文件分析一個(gè)類為啥最多支持65535個(gè)接口
<<<為什么重寫equals還要重寫hashcode方法
<<<如何自定義注解
<<<十大經(jīng)典排序算法匯總-動(dòng)畫演示
<<<JDK8十大新特性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容