中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中的四種引用分別是什么

發布時間:2022-01-04 17:13:30 來源:億速云 閱讀:154 作者:柒染 欄目:大數據

java中的四種引用分別是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

每一種語言都有著自己操作內存元素的方式,C語言通過指針,而java就是通過引用。作為一門面向對象的語言,在java中世事萬物皆對象。但是我們操作的標識符實際上是對象的一個引用(reference)。今天我們來分析一下java中的四種引用。

一、引用的歷史

在Java中,我們的垃圾回收機制回收垃圾對象的時候就會依據對象的引用。比如說通過不同的垃圾回收算法,這里有兩種:引用計數法和可達性分析法

1、引用計數法:為每個對象添加一個引用計數器,每當有一個引用指向它時,計數器就加1,當引用失效時,計數器就減1,當計數器為0時,則認為該對象可以被回收。

2、可達性分析算法:從一個被稱為 GC Roots 的對象開始向下搜索,如果一個對象到GC Roots沒有任何引用鏈相連時,則說明此對象不可用。

java中的四種引用分別是什么

目前的垃圾回收基本上采用第二種方式,第一種方式基本上已經被舍棄了。

在jdk1.2之前,java對引用的概念只有“已被引用”和"未被引用"兩種狀態。后來所以在 JDK.1.2 之后,Java 對引用的概念進行了擴充,將引用分為了:強引用、軟引用、弱引用、虛引用4 種,也就是我們今天所講的主題。這 4 種引用的強度依次減弱。

二、四種引用

1、強引用

如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。比如String str = "hello"這時候str就是一個強引用。當然我們也可以使用str=null取消一個強引用。下面我們使用代碼來測試一下強引用:

前提是我們先要設置一些jvm參數, -Xms2M -Xmx3M表示初始內存是2M,最大內存是3M。設置的步驟如下:

步驟:
1、選中已經寫好的項目
2、Run->Debug configurations->Java Application  雙擊
3、Arguments->VM arguments  
4、在VM arguments 里面就可以對虛擬機的內存參數進行設置  
5、設置完成后,Apply->Debug

1public class Test {
2    public static void main(String[] args) {
3        testStrongReference();
4    }
5    private static void testStrongReference() {
6        //1M的時候是正常的,但是我們調到3M這時候就會出現OutOfMemoryError
7        byte[] buff = new byte[1024 * 1024 * 3];
8    }
9}
 

2、軟引用

如果一個對象具有軟引用,它就不會被垃圾回收器回收。只有在內存空間不足時,軟引用才會被垃圾回收器回收。這種引用常常被用來實現緩存技術。因為緩存區里面的東西,之后在內存不足的時候才會被清空。下面我們再進行測試一下:前提是設置虛擬機參數 -Xms2M -Xmx3M。

 1private static void testSoftReference() {
2    //創建10個大小為1M的字節,賦值給軟引用
3    for (int i = 0; i < 10; i++) {
4        byte[] buff = new byte[1024 * 1024];
5        SoftReference<byte[]> sr = new SoftReference<>(buff);
6        list.add(sr);
7    }
8    //主動通知JVM,建議回收
9   System.gc();
10    //循環遍歷出來
11   for(int i=0; i < list.size(); i++){
12        Object obj = ((SoftReference) list.get(i)).get();
13        System.out.println(obj.toString());
14   } 
15}
 

我們可以測試一下,會發現只有最后一個軟引用對象打印了出來,其他的全部為null。這是為什么呢?這是因為我們設置的參數是最大3M,內存不足的時候,會主動回收這些對象垃圾。

3、弱引用

如果一個對象具有弱引用,在垃圾回收時候,一旦發現弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。不過由于垃圾回收器是一個優先級較低的線程,所以并不一定能迅速發現弱引用對象。我們把上面的對象如果改成弱引用的話,你會發現所有的全部為空,這就是因為創建了10個1M的對象,超出了3M,無論內存是否足夠,都會被回收。

4、虛引用

如果一個對象具有弱引用,就相當于沒有引用,在任何時候都有可能被回收。虛引用是使用PhantomReference創建的引用,虛引用也稱為幽靈引用或者幻影引用,是所有引用類型中最弱的一個。一個對象是否有虛引用的存在,完全不會對其生命周期構成影響,也無法通過虛引用獲得一個對象實例。

使用虛引用的目的就是為了得知對象被GC的時機,所以可以利用虛引用來進行銷毀前的一些操作,比如說資源釋放等。這個虛引用對于對象而言完全是無感知的,有沒有完全一樣,但是對于虛引用的使用者而言,就像是待觀察的對象的把脈線,可以通過它來觀察對象是否已經被回收,從而進行相應的處理。

看完上述內容,你們掌握java中的四種引用分別是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灌阳县| 德州市| 瑞昌市| 新巴尔虎右旗| 鲁甸县| 昌平区| 尼勒克县| 牡丹江市| 鸡西市| 宝清县| 新巴尔虎右旗| 贵溪市| 突泉县| 剑阁县| 靖江市| 涞源县| 夹江县| 桐乡市| 监利县| 高邑县| 蕲春县| 德昌县| 尚志市| 东阿县| 高唐县| 平舆县| 饶平县| 梓潼县| 珠海市| 凭祥市| 桐柏县| 长沙市| 东阳市| 建湖县| 顺平县| 涞源县| 石屏县| 山东省| 黄浦区| 城口县| 邵武市|