java 幽灵引用_Java 幽灵引用的作用
原標題:Java 幽靈引用的作用
來源:imzoer,
blog.csdn.net/imzoer/article/details/8044900
找實習的時候,面試大摩,就遇到了這個問題,當時真不該跟面試官交流這個內容的。
垃圾收集過程中,對象的可觸及狀態改變的時候,可以把引用對象和引用隊列關聯起來【這里說的關聯,是說垃圾收集器會把要回收的對象添加到引用隊列ReferenceQueue】,這樣在可觸及性發生變化的時候得到“通知”。
當垃圾收集器對加入隊列的對象改變可觸及性的時候,就可以收到異步通知了。
看下面的代碼:
package static_;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.Field;
public class Test {
public static boolean isRun = true;
@SuppressWarnings("static-access")
public static void main(String[] args) throws Exception {
String abc = new String("abc");
System.out.println(abc.getClass() + "@" + abc.hashCode());
final ReferenceQueue referenceQueue = new ReferenceQueue();
new Thread() {
public void run() {
while (isRun) {
Object obj = referenceQueue.poll();
if (obj != null) {
try {
Field rereferent = Reference.class
.getDeclaredField("referent");
rereferent.setAccessible(true);
Object result = rereferent.get(obj);
System.out.println("gc will collect:"
+ result.getClass() + "@"
+ result.hashCode() + "t"
+ (String) result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}.start();
PhantomReference abcWeakRef = new PhantomReference(abc,
referenceQueue);
abc = null;
Thread.currentThread().sleep(3000);
System.gc();
Thread.currentThread().sleep(3000);
isRun = false;
}
}
我們用一個線程檢測referenceQueue里面是不是有內容,如果有內容,打印出來queue里面的內容。
從這個例子中,我們可以看出來,虛引用的作用是,我們可以聲明虛引用來引用我們感興趣的對象,在gc要回收的時候,gc收集器會把這個對象添加到referenceQueue,這樣我們如果檢測到referenceQueue中有我們感興趣的對象的時候,說明gc將要回收這個對象了。此時我們可以在gc回收之前做一些其他事情,比如記錄些日志什么的。
感謝藍大牛分享下面的例子。
在java中,finalize函數本來是設計用來在對象被回收的時候來做一些操作的(類似C++的析構函數)。但是對象被GC什么時候回收的時間,卻是不固定的,這樣finalize函數很尷尬。虛引用可以用來解決這個問題。
在創建虛引用的時候必須傳入一個引用隊列。在一個對象的finalize函數被調用之后,這個對象的幽靈引用會被加入到引用隊列中。通過檢查隊列的內容就知道對象是不是要準備被回收了。
幽靈引用的使用并不多見,主要是實現細粒度的內存控制。比如下面代碼實現一個緩存。程序在確認原來的對象要被回收之后,才申請內存創建新的緩存。
在上面的代碼中,每次申請新的緩存的時候,都要確保之前的字節數組被成功回收。引用隊列的remove方法會阻塞直到虛引用被加入到引用隊列中。【只有對象在內存中被移除之后才會進入引用隊列中】。
不過注意,這種方式可能會導致gc次數過多,程序吞吐量下降。
另外注意,system.gc調用僅僅是建議虛擬機進行回收,并不一定馬上會進行gc。返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的java 幽灵引用_Java 幽灵引用的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 升级12代i5+2.8K OLED屏:宏
- 下一篇: AMD Zen4锐龙未发布就被开盖:变了