Java中,垃圾回收是非常重要的一部分,而軟引用和虛引用則是垃圾回收機(jī)制的重要部分。
軟引用可以用來(lái)描述那些還有用但并非必需的對(duì)象。如果內(nèi)存空間足夠,那么被軟引用指向的對(duì)象就會(huì)保留在內(nèi)存中,否則就會(huì)被回收。軟引用可以通過(guò)在程序中使用java.lang.ref.SoftReference類進(jìn)行創(chuàng)建。
// 創(chuàng)建一個(gè)普通對(duì)象 Object object = new Object(); // 創(chuàng)建一個(gè)軟引用 SoftReference<Object> softReference = new SoftReference<>(object); // 清除對(duì)象 object = null;
虛引用也可以用來(lái)描述那些還有用但并非必需的對(duì)象,但和軟引用不同的是,虛引用并不能通過(guò)它來(lái)獲取被引用的對(duì)象。虛引用可以用來(lái)跟蹤對(duì)象被垃圾回收的狀態(tài)。虛引用可以通過(guò)在程序中使用java.lang.ref.PhantomReference類進(jìn)行創(chuàng)建。
// 創(chuàng)建一個(gè)普通對(duì)象 Object object = new Object(); // 創(chuàng)建虛引用 PhantomReference<Object> phantomReference = new PhantomReference<>(object, referenceQueue); // 清除對(duì)象 object = null;
虛引用主要用于在對(duì)象被回收時(shí)收到通知或者執(zhí)行一些清理操作。例如,當(dāng)JVM通過(guò)Finalizer線程回收對(duì)象時(shí),如果這個(gè)對(duì)象是被虛引用引用的,那么虛引用對(duì)應(yīng)的對(duì)象就會(huì)進(jìn)入一個(gè)已經(jīng)準(zhǔn)備好被清理的狀態(tài),并且可以通過(guò)ReferenceQueue獲得通知。