您好,登錄后才能下訂單哦!
java中的四種引用分別是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
每一種語言都有著自己操作內存元素的方式,C語言通過指針,而java就是通過引用。作為一門面向對象的語言,在java中世事萬物皆對象。但是我們操作的標識符實際上是對象的一個引用(reference)。今天我們來分析一下java中的四種引用。
一、引用的歷史
在Java中,我們的垃圾回收機制回收垃圾對象的時候就會依據對象的引用。比如說通過不同的垃圾回收算法,這里有兩種:引用計數法和可達性分析法
1、引用計數法:為每個對象添加一個引用計數器,每當有一個引用指向它時,計數器就加1,當引用失效時,計數器就減1,當計數器為0時,則認為該對象可以被回收。
2、可達性分析算法:從一個被稱為 GC Roots 的對象開始向下搜索,如果一個對象到GC Roots沒有任何引用鏈相連時,則說明此對象不可用。
目前的垃圾回收基本上采用第二種方式,第一種方式基本上已經被舍棄了。
在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中的四種引用分別是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。