日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 幽灵引用_Java 幽灵引用的作用

發布時間:2023/12/10 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 幽灵引用的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。