015. 深入JVM學習—Java引用類型

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

1. 引用類型劃分


  1. 強引用:當內存不足時,JVM寧可出現“OutOfMemoryError”錯誤停止,也需要進行保存,并且不會將此空間回收。

  2. 軟引用:當內存不足的時候,進行對象的回收處理,往往用于高速緩存中。

  3. 弱引用:不管內存是否緊張,只要有垃圾產生,立即回收。

  4. 幽靈引用(虛引用):和沒有引用是一樣的。

2. 強引用


1. 簡單介紹

  • 強引用是JVM默認的支持模式,即:在引用的期間內,如果該堆內存被指定的棧內存有聯系,那么該對象就無法被GC所回收,而一旦出現內存空間不足,就會出現“OutOfMemoryError”。

2. 范例:觀察強引用

  • 測試代碼

    public class TestDemo {public static void main(String[] args) {Object obj = new Object(); // 強引用,默認的支持Object ref = obj; // 引用傳遞obj = null; // 斷開了一個連接System.gc();System.out.println(ref);}
    }
    
  • 終端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 結果

    java.lang.Object@15db9742
    
  • 結論

    • 此時如果對象堆內存有棧內存的指向,那么該對象將無法被GC回收。
    • 強引用是我們一直在使用的模式,并且也是以后的開發中主要的使用模式,因為強引用有這樣的內存分配異常問題,所以開發原則是盡量少實例化對象。

3. 軟引用


1. 簡單介紹

  • 在很多的開源組件之中,往往會使用軟引用作為緩存組件出現,其最大的特點:內存不足時回收,充足時不回收。

  • 想實現軟引用需要單獨的一個類來實現控制:java.lang.ref.SoftReference

2. 范例:觀察軟引用

  • 測試代碼:

    import java.lang.ref.SoftReference;public class TestDemo {public static void main(String[] args) {Object obj = new Object();SoftReference<Object> ref = new SoftReference<Object>(obj); // 軟引用obj = null; // 斷開連接System.gc();System.out.println(ref.get());}
    }
    
  • 終端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 結果

    java.lang.Object@15db9742
    
  • 結論

    • 軟引用在內存不緊張的情況下不會被回收。

3. 范例:觀察內存緊張情況下的軟引用

  • 測試代碼

    import java.lang.ref.SoftReference;public class TestDemo {public static void main(String[] args) {Object obj = new Object();String str = "hello world !!!";SoftReference<Object> ref = new SoftReference<Object>(obj);obj = null;try {for (int i = 0; i < 10000; i++) {str += str;str.intern();}} catch (Throwable e) {}System.gc();System.out.println(ref.get());}
    }
    
  • 終端命令

    > javac TestDemo.java
    > java -Xmx10m -Xms10m TestDemo
    
  • 結果

    null
    
  • 結論

    • 軟引用在內存緊張的情況下會被回收。

4. 弱引用


1. 簡單介紹

  • 弱引用,只要一進行gc處理,那么所引用的對象將會立即被回收。弱引用需要使用的是Map接口的子類:java.util.WeakHashMap。

2. 范例:觀察弱引用

  • 測試代碼

    import java.lang.ref.SoftReference;
    import java.util.Map;
    import java.util.WeakHashMap;public class TestDemo {public static void main(String[] args) {String key = new String("shadowolf");String value = new String("www.shadowolf.cn");Map<String, String> map = new WeakHashMap<String, String>();map.put(key, value);System.out.println(map);key = null;System.out.println(map);System.gc();System.out.println(map);}
    }
    
  • 終端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 結果

    {shadowolf=www.shadowolf.cn}
    {shadowolf=www.shadowolf.cn}
    {}
    
  • 結論

    • 一旦出現GC,則必須進行回收處理,并且一回收一個準。

3. 范例:觀察 java.lang.ref.WeakReference

  • 測試代碼

    import java.lang.ref.SoftReference;
    import java.lang.ref.WeakReference;
    import java.util.Map;
    import java.util.WeakHashMap;public class TestDemo {public static void main(String[] args) {String key = new String("shadowolf");WeakReference<String> ref = new WeakReference<String>(key);System.out.println(ref.get());key = null;System.out.println(ref.get());System.gc();System.out.println(ref.get());}
    }
    
  • 終端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 結果

    shadowolf
    shadowolf
    null
    

5. 引用隊列


1. 簡單介紹

  • 引用隊列保存那些準備被回收的對象。很多時候所有的對象的回收掃描都是從根對象開始的,那么對于整個GC而言,如果要想確定哪些對象可以被回收,就必須確定好引用的強度,這個也就是所謂的引用路徑的設置。

2. 引用隊列的操作流程

引用隊列操作流程

  1. 單條引用路徑的可及性判斷:在這條路徑上,最弱的一個引用決定對象的可及性。

  2. 多條引用路徑的可及性判斷:在這幾條路徑上,最強的一個引用決定對象的可及性。

  3. 例如:如果要找到對象5,那么1找到5屬于“強 + 軟”,2找到5屬于“強 + 弱”。軟引用比弱引用保存的強。所以這個時候對于對象的引用而言,如果要進行引用關聯的判斷,那么就必須找到強關聯,為了避免非強引用對象所帶來的內存引用問題,所以提供引用隊列的概念。如果在創建一個軟引用或弱引用對象使用了引用隊列的方式,那么這個對象在回收之后會自動保存到引用隊列之中。

3. 范例:使用引用隊列

  • 測試代碼

    import java.lang.ref.ReferenceQueue;
    import java.lang.ref.WeakReference;public class TestDemo {public static void main(String[] args) throws Exception {Object obj = new Object();ReferenceQueue<Object> queue = new ReferenceQueue<Object>();WeakReference<Object> ref =new WeakReference<Object>(obj, queue);System.out.println(queue.poll());obj = null;System.gc();Thread.sleep(100); // 保存引用隊列需要點時間System.out.println(queue.poll());}
    }
    
  • 終端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 結果

    null
    java.lang.ref.WeakReference@15db9742
    
  • 結論

    • 被回收的弱引用對象被保存到了引用隊列中。
    • 引用隊列主要做一些被回收對象的控制。

6. 幽靈引用(虛引用)


1. 簡單介紹

  • 永遠取得不了的數據就叫幽靈引用。

2. 范例:觀察幽靈引用

  • 測試代碼

    import java.lang.ref.PhantomReference;
    import java.lang.ref.ReferenceQueue;public class TestDemo {public static void main(String[] args) throws Exception {Object obj = new Object();ReferenceQueue<Object> queue = new ReferenceQueue<Object>();PhantomReference<Object> ref = new PhantomReference<Object>(obj, queue);System.gc();System.out.println(ref.get());System.out.println(queue.poll());}
    }
    
  • 終端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 結果

    null
    null
    
  • 結論

    • 所有保存在幽靈引用類型中的數據都不會真正的保留。

轉載于:https://my.oschina.net/shadowolf/blog/1837258

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538386.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python人臉關鍵點識別_用Face++實現人臉關鍵點檢測

最近看了一篇很有意思的文章 http://matthewearl.github.io/2015/07/28/switching-eds-with-python/ &#xff0c;本來想自己復現一下&#xff0c;后來發現自己太菜&#xff0c;用了一整天只完成了不到一半&#xff0c;最近要找工作了&#xff0c;看書看的有點煩&#xff0c;本…

【東營seo】SEO發展下的大機遇

【東營seo】SEO發展下的大機遇 seo優化越來越難做&#xff0c;很多的人都開始懷疑seo優化沒有價值。的確現如今seo優化與十年前比確實不是一個級別的&#xff0c;即便如此&#xff0c;seo優化還是存在其持續發展的機制。  自然搜索排名不再是唯一的競爭點&#xff0c;語音搜索…

手機整屏顯示數據php,完美解決手機網頁大背景不能鋪完整個屏幕的超級代碼

html,body{min-height:100%;} 優化 html{min-height:100%;} html,body{min-height:100%;}body{background-image:url(bg_640.jpg);background-size:cover;babackground-repeat:no-repeat;}.main{padding-top:141%;text-align:cenhtml,body{min-height:100%;}優化html{min-heigh…

python linux教程_Python入門系列教程1—linux基礎

課程咨詢、獲取課件、技術交流直接加入博學谷在線學習&#xff1a;631731828課程簡介本課程是Python系列入門課程的第一階段&#xff0c;首先通過介紹不同領域的三種操作系統&#xff0c;操作系統的發展簡史以及Linux系統的文件目錄結構&#xff0c;讓大家對Linux系統有一個簡單…

如何解決android studio的模擬器有密碼的問題

原文鏈接&#xff1a;https://jingyan.baidu.com/article/e4d08ffd6a95300fd2f60dcf.html ------------------------ 在使用Android Studio的時候&#xff0c;創建的模擬器開機竟然有密碼,提示&#xff1a;to start android,enter your password&#xff0c;困擾了好長時間&am…

為回饋廣大學員,智捷課堂買關老師Cocos2d-x課程送Cocos2d-x圖書

為回饋廣大學員&#xff0c;智捷課堂買關老師Cocos2d-x課程送Cocos2d-x圖書 一、凡購買如下課程送一本圖書&#xff1a; 1、 Cocos2d-x入門與提高視頻教程__Part 22、 Cocos2d-x數據持久化與網絡通信__Part 33、 Cocos2d-x架構設計與性能優化內存優化視頻教程__Part 44、 Cocos…

java手機音樂文件夾,從原始文件夾打開音樂文件,使用Android上的意圖在設備的默認應用程序上播放...

我正在嘗試寫一個打開設備默認音樂播放器的意圖來播放我在android工作室項目中的原始文件夾上的音樂文件(mp3) . 到目前為止&#xff0c;我找到了意圖的代碼&#xff0c;但我得到了如何命令它打開特定的mp3文件&#xff0c;在媒體播放器上播放到目前為止&#xff0c;我寫了這樣…

表正在被別的用戶或進程使用_linux內核對進程的管理分為兩個方面

嵌入式開發直播課 - linux內核通知鏈 - 創客學院直播室?www.makeru.com.cn眾所周知&#xff0c;現在的分時操作系統能夠在一個CPU上運行多個程序&#xff0c;讓這些程序表面上看起來是在同時運行的。linux就是這樣的一個操作系統。在linux系統中&#xff0c;每個被運行的程序實…

android studio生成簽名導打包的方法

原文鏈接&#xff1a;http://blog.csdn.net/l_215851356/article/details/69914213 ---------------------------------如果圖片失效了&#xff0c;見有道云筆記------------------- 方法一&#xff1a; 在android中。可以非常快速的生成簽名文件.jsk文件。步驟如下&#xff1…

C艸 指針和const的關系和注意事項(非常有意思)

有兩種不同的形式將const關鍵字指向指針。 第一種&#xff1a;讓指針指向一個常量對象 const float g_moon 1.63; float * pm &g_moon; // 不允許 no allowed 第二種&#xff1a; 是將指針本身聲明為常量 聲明一個指向常量的指針pt int age 39; const int *pt &age…

concat php,php基于concat實現無限分類

這篇文章主要介紹了php無限分類使用concat是如何實現的&#xff0c;需要的朋友可以參考下一、數據庫設計---- Table structure for table category--CREATE TABLE category (id int(11) NOT NULL auto_increment,catpath varchar(255) default NULL,name varchar(255) default …

vbs腳本延時_Wincc的腳本進程執行問題

接到某同事B的電話&#xff0c;說是一段Wincc里面的VBS腳本出現了問題&#xff1a;A按鈕和B按鈕&#xff0c;要求A按鈕點擊后&#xff0c;對plc某變量寫1并等待5s后寫0&#xff0c;在這5s期間如果點擊B按鈕&#xff0c;同樣是對另外一個變量如此操作&#xff0c;則plc在5s內檢測…

禁止進入activity后EditText自動獲得焦點的方法

原文鏈接&#xff1a;http://blog.csdn.net/tablle/article/details/51659277 --------------------- 1、禁止進入activity后EditText自動獲得焦點的方法 在項目中&#xff0c;一進入一個頁面, EditText默認就會自動獲取焦點。 那么如何取消這個默認行為呢&#xff1f; 在網上…

微信小程序 - 非Form數據怎么發送到后端?

通過設置異步緩存&#xff0c;就可以做到 wx.setStorageSync(imgs,imglist); 最后的提交信息&#xff1a;

python抓包代碼_Python抓包并解析json爬蟲的完整實例代碼

Python抓包并解析json爬蟲FwA免費資源網在使用Python爬蟲的時候&#xff0c;通過抓包url&#xff0c;打開url可能會遇見以下類似網址&#xff0c;打開后會出現類似這樣的界面&#xff0c;無法繼續進行爬蟲&#xff1a;FwA免費資源網FwA免費資源網例如&#xff1a;FwA免費資源網…

Android之back鍵攔截處理

原文鏈接&#xff1a;http://blog.csdn.net/lyjit/article/details/51597160 ---------------------------------------------------- Back鍵是手機上的后退鍵&#xff0c;在Android上有兩種方法來獲取該按鈕的事件。 ** 一&#xff1a;如何捕獲Back按鍵事件 ** 1.直接獲取按…

php富強民主,WordPress主題添加“富強、民主、文明、和諧、”等鼠標點擊特效

打開“外觀-主題-編輯-(最右側)模板-主題頁腳 (footer.php)”加入以下代碼/* 鼠標特效 */var a_idx 0;jQuery(document).ready(function($) {$("body").click(function(e) {var a new Array("富強", "民主", "文明", "和諧&quo…

DjangoAdmin站點調整列表頁展示

調整列表頁展示 1 頁大小 每頁中顯示多少條數據&#xff0c;默認為每頁顯示100條數據&#xff0c;屬性如下&#xff1a; list_per_page1001&#xff09;打開booktest/admin.py文件&#xff0c;修改AreaAdmin類如下&#xff1a; class BookInfoAdmin(admin.ModelAdmin):list_per…

大華熱成像netsdkdemo_千年博物,智慧展館丨大華股份全力守護“華夏珍寶庫”...

陜西歷史博物館作為我國第一座大型現代化國家級博物館&#xff0c;以及首批國家一級博物館和全國排名前五的國家頂級博物館&#xff0c;被譽為“古都明珠 華夏寶庫”&#xff0c;是講述五千年中華文化的大學堂&#xff0c;是我國博物館事業發展的重要里程碑。隨著陜西歷史博物館…

Android中scrollview與webview沖突事件

原文鏈接&#xff1a;http://www.linuxidc.com/Linux/2014-03/98847.htm -------------------------------------------------------------- 在做更新界面的時候&#xff0c;同時使用了scrollview和webview兩個組件。在模擬器中測試的時候沒有問題&#xff0c;但是在手機上測試…