public class QuoteTest {
public static void main(String[] args) {
/*================================*/
///////////////////////////////////////////////////////////////////////////
// 如果一個(gè)對象具有強(qiáng)引用,那就類似于必不可少的生活用品,垃圾回收器絕不會(huì)回收它,當(dāng)內(nèi)存空間不足,
//Java虛擬機(jī)寧愿拋出outofMermoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對象來解決內(nèi)存不足問題
//
///////////////////////////////////////////////////////////////////////////
/*在heap堆中創(chuàng)建新的Object對象通過obj引用這個(gè)對象,第二句是通過obj建立o1到new Object()這個(gè)heap堆中的對象的引用
*這兩個(gè)引用都是強(qiáng)引用,只要存在heap中對象的引用,gc就不會(huì)收集該對象
*/
Object obj = new Object();
Object o1 = obj;
obj = null;
o1 = null;
//對象屬于那種可及的對象,由它的最強(qiáng)的引用決定
String abc = new String("abc");
SoftReference<String> abcSoftRef = new SoftReference<String>(abc);//軟引用
WeakReference<String> abcWeakRef = new WeakReference<String>(abc);//弱引用
abc = null;//執(zhí)行這行代碼的時(shí)候?qū)ο蟛辉偈菑?qiáng)可及,變成軟可及的。
abcSoftRef = null;//對象變成弱可及
// weakTemp();
test();
}
public static void softTemp() {
A a = new A();
SoftReference<A> aSoftRef = new SoftReference<>(a);
if (aSoftRef != null) {
a = aSoftRef.get();
} else {
a = new A();
aSoftRef = new SoftReference<A>(a);
}
}
///////////////////////////////////////////////////////////////////////////
// 弱引用于軟引用的區(qū)別在于,只具有弱引用的對象擁有跟短暫的生命周. 期,在垃圾回收器線程掃描
// ,一旦發(fā)現(xiàn)持有了弱引用的對象,不管當(dāng)前內(nèi)存空間足夠與否,他都會(huì)回收它的內(nèi)存
// 弱引用可以和一個(gè)引用隊(duì)列聯(lián)合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機(jī)就會(huì)吧
// 弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列當(dāng)中
///////////////////////////////////////////////////////////////////////////
public static void weakTemp() {
String abc = new String("abc");
WeakReference<String> abcWeakRef = new WeakReference<>(abc);
abc = null;
System.out.println("before gc:" + abcWeakRef.get());
System.gc();
System.out.println("after gc :" + abcWeakRef.get());
}
public static boolean isRunning = true;
///////////////////////////////////////////////////////////////////////////
// 虛引用 必須和引用隊(duì)列關(guān)聯(lián)使用
///////////////////////////////////////////////////////////////////////////
public static void test() {
String abc = new String("abc");
System.out.println(abc.getClass() + " @" + abc.hashCode());
final ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
new Thread() {
public void run() {
while (isRunning) {
Object poll = referenceQueue.poll();
if (poll != null) {
try {
Field rereferent = Reference.class.getDeclaredField("referent");
rereferent.setAccessible(true);
Object result = rereferent.get(poll);
System.out.println("gc will collect:" + result.getClass() + " @" + result.hashCode());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}.start();
PhantomReference<String> abcPhRef = new PhantomReference<>(abc, referenceQueue);
abc = null;
try {
Thread.currentThread().sleep(3000);
System.gc();
Thread.currentThread().sleep(3000);
isRunning = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static class A {}
}
java強(qiáng)、弱、軟、虛引用
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Java內(nèi)存管理包括內(nèi)存分配(創(chuàng)建Java對象)和內(nèi)存回收(回收J(rèn)ava對象)。這兩者都是JVM(Java虛擬機(jī))...
- JAVA四種引用(強(qiáng)引用,弱引用,軟引用,虛引用) [toc] 參考:Java 的強(qiáng)引用、弱引用、軟引用、虛引用四...
- 強(qiáng)引用: 只要引用存在,垃圾回收器永遠(yuǎn)不會(huì)回收 Object obj = new Object(); //可直接通...
- 強(qiáng)引用 Strong reference就是我們常見的引用指向一個(gè)對象,只要強(qiáng)引用指向一個(gè)對象,就能表明對象還活著...
- 1、強(qiáng)引用(StrongReference) 也就是我們new出來的對象當(dāng)內(nèi)存不足的時(shí)候,JVM寧可出現(xiàn)OutOf...