国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

簡單理解Java GC與幽靈引用

開發 后端
Java中一共有4種類型的引用:StrongReference、SoftReference、WeakReference以及PhantomReference (幽靈引用), 這 4 種類型的引用與Java GC有著密切的關系, 讓我們逐一來看它們的定義和使用場景。

1. Strong Reference

StrongReference 是 Java 的默認引用實現,它會盡可能長時間的存活于 JVM 內, 當沒有任何對象指向它時Java GC 執行后將會被回收

  1. @Test  
  2. public void strongReference() {   
  3. Object referent = new Object();   
  4.    
  5. /**  
  6.  * 通過賦值創建 StrongReference   
  7.  */  
  8. Object strongReference = referent;   
  9.    
  10. assertSame(referent, strongReference);   
  11.    
  12. referent = null;   
  13. System.gc();   
  14.    
  15. /**  
  16.  * StrongReference 在 GC 后不會被回收  
  17.  */  
  18. assertNotNull(strongReference);   
  19. }   
  20.  
  21.  @Test  
  22.  public void strongReference() {  
  23.   Object referent = new Object();  
  24.     
  25.   /**  
  26.    * 通過賦值創建 StrongReference   
  27.    */  
  28.   Object strongReference = referent;  
  29.     
  30.   assertSame(referent, strongReference);  
  31.     
  32.   referent = null;  
  33.   System.gc();  
  34.     
  35.   /**  
  36.    * StrongReference 在 GC 后不會被回收  
  37.    */  
  38.   assertNotNull(strongReference);  
  39.  } 

2. WeakReference & WeakHashMap

WeakReference, 顧名思義,是一個弱引用,當所引用的對象在 JVM 內不再有強引用時, Java GC 后 weak reference 將會被自動回收

  1. @Test  
  2. public void weakReference() {   
  3. Object referent = new Object();   
  4. WeakReference<Object> weakRerference = new WeakReference<Object>(referent);   
  5.  
  6. assertSame(referent, weakRerference.get());   
  7.    
  8. referent = null;   
  9. System.gc();   
  10.    
  11. /**  
  12.  * 一旦沒有指向 referent 的強引用, weak reference 在 GC 后會被自動回收  
  13.  */  
  14. assertNull(weakRerference.get());   
  15. }   
  16.  
  17.  @Test  
  18.  public void weakReference() {  
  19.   Object referent = new Object();  
  20.   WeakReference<Object> weakRerference = new WeakReference<Object>(referent);  
  21.    
  22.   assertSame(referent, weakRerference.get());  
  23.     
  24.   referent = null;  
  25.   System.gc();  
  26.     
  27.   /**  
  28.    * 一旦沒有指向 referent 的強引用, weak reference 在 GC 后會被自動回收  
  29.    */  
  30.   assertNull(weakRerference.get());  
  31.  } 

WeakHashMap 使用 WeakReference 作為 key, 一旦沒有指向 key 的強引用, WeakHashMap 在Java GC 后將自動刪除相關的 entry

  1. @Test  
  2. public void weakHashMap() throws InterruptedException {   
  3. Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();   
  4. Object key = new Object();   
  5. Object value = new Object();   
  6. weakHashMap.put(key, value);   
  7.  
  8. assertTrue(weakHashMap.containsValue(value));   
  9.    
  10. key = null;   
  11. System.gc();   
  12.    
  13. /**  
  14.  * 等待無效 entries 進入 ReferenceQueue 以便下一次調用 getTable 時被清理  
  15.  */  
  16. Thread.sleep(1000);   
  17.    
  18. /**  
  19.  * 一旦沒有指向 key 的強引用, WeakHashMap 在 GC 后將自動刪除相關的 entry  
  20.  */  
  21. assertFalse(weakHashMap.containsValue(value));   
  22. }   
  23.  
  24.  @Test  
  25.  public void weakHashMap() throws InterruptedException {  
  26.   Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();  
  27.   Object key = new Object();  
  28.   Object value = new Object();  
  29.   weakHashMap.put(key, value);  
  30.    
  31.   assertTrue(weakHashMap.containsValue(value));  
  32.     
  33.   key = null;  
  34.   System.gc();  
  35.     
  36.   /**  
  37.    * 等待無效 entries 進入 ReferenceQueue 以便下一次調用 getTable 時被清理  
  38.    */  
  39.   Thread.sleep(1000);  
  40.     
  41.   /**  
  42.    * 一旦沒有指向 key 的強引用, WeakHashMap 在 GC 后將自動刪除相關的 entry  
  43.    */  
  44.   assertFalse(weakHashMap.containsValue(value));  
  45.  } 

 3. SoftReference

SoftReference 于 WeakReference 的特性基本一致, ***的區別在于 SoftReference 會盡可能長的保留引用直到 JVM 內存不足時才會被回收(虛擬機保證), 這一特性使得 SoftReference 非常適合緩存應用

  1. @Test  
  2. public void softReference() {   
  3. Object referent = new Object();   
  4. SoftReference<Object> softRerference = new SoftReference<Object>(referent);   
  5.  
  6. assertNotNull(softRerference.get());   
  7.    
  8. referent = null;   
  9. System.gc();   
  10.    
  11. /**  
  12.  *soft references 只有在 jvm OutOfMemory 之前才會被回收, 所以它非常適合緩存應用  
  13.  */  
  14. assertNotNull(softRerference.get());   
  15. }   
  16.  
  17.  @Test  
  18.  public void softReference() {  
  19.   Object referent = new Object();  
  20.   SoftReference<Object> softRerference = new SoftReference<Object>(referent);  
  21.    
  22.   assertNotNull(softRerference.get());  
  23.     
  24.   referent = null;  
  25.   System.gc();  
  26.     
  27.   /**  
  28.    *soft references 只有在 jvm OutOfMemory 之前才會被回收, 所以它非常適合緩存應用  
  29.    */  
  30.   assertNotNull(softRerference.get());  
  31.  } 

4. PhantomReference

作為本文主角, Phantom Reference(幽靈引用) 與 WeakReference 和 SoftReference 有很大的不同,因為它的 get() 方法永遠返回 null, 這也正是它名字的由來

  1. @Test  
  2. public void phantomReferenceAlwaysNull() {   
  3. Object referent = new Object();   
  4. PhantomReference<Object> phantomReference = new PhantomReference<Object>(referent, new ReferenceQueue<Object>());   
  5.    
  6. /**  
  7.  * phantom reference 的 get 方法永遠返回 null   
  8.  */  
  9. assertNull(phantomReference.get());   
  10. }   
  11.  
  12.  @Test  
  13.  public void phantomReferenceAlwaysNull() {  
  14.   Object referent = new Object();  
  15.   PhantomReference<Object> phantomReference = new PhantomReference<Object>(referent, new ReferenceQueue<Object>());  
  16.     
  17.   /**  
  18.    * phantom reference 的 get 方法永遠返回 null   
  19.    */  
  20.   assertNull(phantomReference.get());  
  21.  } 

諸位可能要問, 一個永遠返回 null 的 reference 要來何用,請注意構造 PhantomReference 時的第二個參數 ReferenceQueue(事實上 WeakReference & SoftReference 也可以有這個參數),
PhantomReference 唯一的用處就是跟蹤 referent何時被 enqueue 到 ReferenceQueue 中.

5. RererenceQueue

當一個 WeakReference 開始返回 null 時, 它所指向的對象已經準備被回收, 這時可以做一些合適的清理工作. 將一個 ReferenceQueue 傳給一個 Reference 的構造函數, 當對象被回收時, 虛擬機會自動將這個對象插入到 ReferenceQueue 中, WeakHashMap 就是利用 ReferenceQueue 來清除 key 已經沒有強引用的 entries.

  1. @Test  
  2. public void referenceQueue() throws InterruptedException {   
  3. Object referent = new Object();  
  4. ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();   
  5. WeakReference<Object> weakReference = new WeakReference<Object>(referent, referenceQueue);   
  6.    
  7. assertFalse(weakReference.isEnqueued());   
  8. Reference<? extends Object> polled = referenceQueue.poll();   
  9. assertNull(polled);   
  10.    
  11. referent = null;   
  12. System.gc();   
  13.  
  14. assertTrue(weakReference.isEnqueued());   
  15. Reference<? extends Object> removed = referenceQueue.remove();   
  16. assertNotNull(removed);   
  17. }  
  18.  
  19.  @Test  
  20.  public void referenceQueue() throws InterruptedException {  
  21.   Object referent = new Object();    
  22.   ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();  
  23.   WeakReference<Object> weakReference = new WeakReference<Object>(referent, referenceQueue);  
  24.     
  25.   assertFalse(weakReference.isEnqueued());  
  26.   Reference<? extends Object> polled = referenceQueue.poll();  
  27.   assertNull(polled);  
  28.     
  29.   referent = null;  
  30.   System.gc();  
  31.  
  32.   assertTrue(weakReference.isEnqueued());  
  33.   Reference<? extends Object> removed = referenceQueue.remove();  
  34.   assertNotNull(removed);  
  35.  } 


6.PhantomReferencevs WeakReference

PhantomReference有兩個好處, 其一, 它可以讓我們準確地知道對象何時被從內存中刪除, 這個特性可以被用于一些特殊的需求中(例如 Distributed GC,XWork 和 google-guice 中也使用 PhantomReference 做了一些清理性工作).

其二, 它可以避免 finalization 帶來的一些根本性問題, 上文提到 PhantomReference 的唯一作用就是跟蹤 referent 何時被 enqueue 到 ReferenceQueue 中,但是 WeakReference 也有對應的功能, 兩者的區別到底在哪呢 ?
這就要說到 Object 的 finalize 方法, 此方法將在 gc 執行前被調用, 如果某個對象重載了 finalize 方法并故意在方法內創建本身的強引用,這將導致這一輪的 GC 無法回收這個對象并有可能
引起任意次 GC, ***的結果就是明明 JVM 內有很多 Garbage 卻 OutOfMemory, 使用 PhantomReference 就可以避免這個問題, 因為 PhantomReference 是在 finalize 方法執行后回收的,也就意味著此時已經不可能拿到原來的引用,也就不會出現上述問題,當然這是一個很極端的例子, 一般不會出現.

7. 對比

Soft vs Weak vs Phantom References
Type Purpose Use When GCed Implementing Class
Strong Reference An ordinary reference. Keeps objects alive as long as they are referenced. normal reference. Any object not pointed to can be reclaimed. default
Soft Reference Keeps objects alive provided there’s enough memory. to keep objects alive even after clients have removed their references (memory-sensitive caches), in case clients start asking for them again by key. After a first gc pass, the JVM decides it still needs to reclaim more space. java.lang.ref.SoftReference
Weak Reference Keeps objects alive only while they’re in use (reachable) by clients. Containers that automatically delete objects no longer in use. After gc determines the object is only weakly reachable java.lang.ref.WeakReference 
java.util.WeakHashMap
Phantom Reference Lets you clean up after finalization but before the space is reclaimed (replaces or augments the use offinalize()) Special clean up processing After finalization. java.lang.ref.PhantomReference


8. Java GC小結
 一般的應用程序不會涉及到 Reference 編程, 但是了解這些知識會對理解Java GC 的工作原理以及性能調優有一定幫助, 在實現一些基礎性設施比如緩存時也可能會用到, 希望本文能有所幫助.

【編輯推薦】

  1. 成為Java高手的重要過程
  2. Java GUI的發展和演化簡史
  3. Java正則表達式工具類實例
  4. 用Java壓縮文件解決沒有中文問題示例
  5. Java與C++語言在作用域上的差異淺析
責任編輯:彭凡 來源: javaeye
相關推薦

2017-11-15 19:30:08

Python內存泄露循環引用

2015-11-02 17:20:00

Java弱引用

2024-12-16 16:10:31

2021-01-21 14:06:57

云計算

2009-09-09 09:36:25

Linq對象引用

2023-12-25 09:30:41

Java垃圾回收

2009-04-10 09:43:00

Java輸出流異常

2013-08-19 17:14:04

.Net強引用弱引用

2009-08-03 17:51:43

C#引用類型

2009-09-03 16:55:58

C#引用類型

2019-09-16 09:23:34

高并發編程CountDownLaCyclicBarri

2019-11-27 14:41:50

Java技術語言

2013-07-31 09:03:45

2022-03-08 13:06:25

引用隊列jvm變量

2009-12-30 15:58:19

Silverlight

2014-03-12 10:19:54

iOS對象

2009-08-19 16:39:44

C#值類型C#引用類型

2012-02-13 10:18:42

C++ 11

2009-08-17 14:48:44

Java參數傳遞機制

2020-12-02 09:01:40

Java基礎
點贊
收藏

51CTO技術棧公眾號

天天综合网天天| 亚洲区成人777777精品| 精品久久久久久久久久| 亚洲精选在线| 欧美片第一页| 日本美女高潮视频| 91久久大香伊蕉在人线| 亚洲欧美福利视频| 亚洲美女在线一区| 日韩专区中文字幕一区二区| 国产精品日韩精品在线播放| 日韩精品系列| 欧美性潮喷xxxxx免费视频看| 国产精品88a∨| 欧美精品一区二区三区四区| 国产精品成人网| 噜噜噜在线观看免费视频日韩 | 日韩精品一卡二卡三卡四卡无卡| 黄色成人在线观看网站| 中文字幕中文字幕在线中文字幕三区 | 狠狠操夜夜操| 先锋影音网一区| 98精品在线视频| 日韩亚洲欧美在线观看| 欧美国产激情一区二区三区蜜月| 亚洲深夜影院| 噜噜噜狠狠夜夜躁精品仙踪林| 国产激情在线观看| 加勒比在线日本| 亚洲精品乱码视频| 国产日产久久高清欧美一区| 国产亚洲欧美日韩美女| 欧美性69xxxx肥| 国产夜色精品一区二区av| 影音先锋久久| 色橹橹欧美在线观看视频高清| 日韩欧美精品一区二区三区| 欧美日韩在线精品一区二区三区激情综 | 蜜臀av在线| 97香蕉久久| 亚洲 欧美 日韩 国产综合 在线| caoporn国产精品免费公开| 欧美激情国产高清| 精品亚洲精品福利线在观看| 在线免费观看日本欧美| 中文字幕一区二区三区四区不卡 | 另类欧美小说| 动漫h在线观看| 国产精品第一区| 日韩av网址在线观看| 亚洲18色成人| 久久久久久麻豆| 久久国产欧美日韩精品| 欧美福利影院| 国产欧美日韩| 精品国产亚洲一区二区在线观看 | 沈樵精品国产成av片| 日韩av福利| 国产精品一区二区三区视频网站| 裸体免费网站| 男人天堂网视频| 中文字幕一区二区三区四区五区六区| 亚洲最大成人免费视频| 91精品国产高清久久久久久91| 99久久精品情趣| 亚洲欧美国产日韩中文字幕| 黄色一级片播放| 榴莲视频成人app| 日韩黄色在线观看| 亚洲欧美日韩在线不卡| 亚洲精品国精品久久99热一| 欧美深深色噜噜狠狠yyy| 高清在线视频不卡| 久久日韩精品一区二区五区| 性亚洲最疯狂xxxx高清| 永久免费在线| 免费视频一区二区| 欧美激情视频播放| av在线免费观看国产| 黄色污网站在线免费观看| 欧美xxx黑人xxx水蜜桃| 免费人成精品欧美精品| 五月天丁香久久| 欧美刺激脚交jootjob| 日韩精品在线播放| 成人自拍爱视频| 高清hd写真福利在线播放| 国产区在线看| 在线欧美亚洲| 欧美性色视频在线| 欧美激情女人20p| 免费黄色日本网站| 国产黄大片在线观看| 一本色道久久综合亚洲精品不卡| 亚洲一级二级在线| 日韩av电影中文字幕| www.日韩.com| 日韩国产精品毛片| av毛片在线| 不卡大黄网站免费看| 91精品国产高清久久久久久91| 激情综合网俺也去| 国产伦乱精品| 黑人巨大精品欧美一区二区一视频 | 成全视频在线播放大地| 水蜜桃色314在线观看| 日本成人在线不卡| 久久av高潮av| 日韩av片免费在线观看| 日韩精品极品毛片系列视频| 亚洲第一偷拍网| 日韩精品在线视频| 国产一区二区三区免费视频| 中文字幕免费精品一区高清| 久久精品亚洲94久久精品| 九色成人免费视频| 欧美做受高潮1| 91精品视频在线播放| www.成人av| 欧洲精品国产| 国产高清不卡无码视频| 久久久一本二本三本| 一区二区亚洲精品国产| 在线资源av| 色婷五月综激情亚洲综合| 亚洲精品一区二区妖精| 日韩一区二区三区资源| 国产精品视频免费一区二区三区| 国产成人免费电影| 欧美日韩三区四区| 中文字幕黄色大片| 亚洲精品久久久久久久蜜桃臀| 国产精品专区在线| 成人性生生活性生交12| 交视频在线观看国产| 蜜桃tv在线播放| 国产在线日本| 美女航空一级毛片在线播放| 色呦呦呦在线观看| 欧美精品在线视频| 91黄色小网站| 精品免费视频| 欧美一二区视频| 亚洲国产综合色| xx视频.9999.com| av基地在线| 久久久久久久久久电影| 欧美日韩免费精品| jizz欧美| 日韩一二三区视频| 日本新janpanese乱熟| 国产精品久久久久久av福利软件| 性欧美大战久久久久久久久| 亚洲一区视频在线| 欧美嫩在线观看| 国产亚洲在线播放| 奇米四色中文综合久久| 国产一区二区黄色| 欧美这里只有精品| 国产色a在线观看| 麻豆网站在线| 成年人网站免费视频| 黄色成人免费观看| 成人精品一区二区三区免费| 欧美在线极品| 青青草这里只有精品| 91久久黄色| av在线一区二区| 疯狂蹂躏欧美一区二区精品| 日韩电影中文字幕在线| 91精品国产高清自在线| 精品网站在线看| 2022亚洲天堂| 黄色在线小视频| av成人亚洲| 91综合网人人| 国产风韵犹存在线视精品| 亚洲精品高清视频在线观看| 日韩欧美色综合网站| 97国产真实伦对白精彩视频8| 国产视频在线观看一区| 国产免费观看高清视频| 内衣办公室在线| 深夜福利亚洲| 1024日韩| 中文字幕精品—区二区四季| 欧美一区二区三区四区在线观看| 欧美精品在线观看91| 久久久影院一区二区三区| 在线免费视频a| 日韩经典av| 精品国产乱码久久久久久蜜坠欲下| 老司机精品视频一区二区三区| 亚洲精品视频在线| 亚洲欧美日韩精品| 国产剧情久久久久久| 国产精品国产亚洲精品看不卡| 成人精品一区二区三区校园激情| 伊人久久大香线蕉av超碰| 久久人人精品|