WeakHashMap相關

本文將深入地介紹關於引用對象(Reference Objects)的知識。基本上說,引用對象提供了一種對象間接引用所需內存的方式,這些引用對象保存在一個引用對象中(類ReferenceQuene),它監視這些引用對象使得其可以訪問。基於這種類型的引用對象,垃圾回收器能夠釋放內存,而一般的對象引用則可能無法釋放。
在Java中,有四種類型的對象引用。常用的是直接引用,如:
 Object obj = new Object()
您可以將直接引用當作一種無需額外的代碼去創建或訪問對象的一種強引用。接下來的三種類型的引用是java.lang.ref包中的Reference類的子類。軟引用(Soft reference)由SoftReference類提供,弱引用(weak reference)由WeakReference類提供,幻像引用(PhantomReference)由PhantomReference提供。
軟引用的工作方式很像數據緩存。當系統內存太低的時候,GC可以任意地釋放軟引用所引用的對象。換句話說,如果一個對象沒有強引用,那麼這個對象就是一個候選釋放對象。在拋出OutOfMemoryException異常之前,GC將要求釋放任何軟引用。
 
弱引用比軟引用弱。如果對象的引用只有弱引用,則GC將可能在任何時候回收內存,而不需要等到內存不足的時候。典型的動作是GC在下一個回收週期中對象的內存被回收。
幻像引用與清理任務有關。他們提供了一種在GC執行終止程序和釋放對象之前即時通知機制。將其理解爲在一個對象之前進行的清理任務。
下面是WeakHashMap的一個簡單示例。WeakTest程序創建一個WeakHashMap的對象,裏面含有一個元素。接着創建了第二個線程等待map清空,要求GC每0.5秒執行一次。主線程等待第二線程完成。
 import java.util.*;
   public class WeakTest {
     private static Map<String, String> map;
     public static void main (String args[]) {
       map = new WeakHashMap<String, String>();
       map.put(new String("Scott"), "McNealey");
       Runnable runner = new Runnable() {
         public void run() {
           while (map.containsKey("Scott")) {
             try {
               Thread.sleep(500);
             } catch (InterruptedException ignored) {
             }
             System.out.println("Checking for empty");
             System.gc();
           }
         }
       };
       Thread t = new Thread(runner);
       t.start();
       System.out.println("Main joining");
       try {
         t.join();
       } catch (InterruptedException ignored) {
       }
     }
   }
因爲在map僅有一個鍵沒有強引用,在map中的項會在最近的一個垃圾回收週期內回收。
運行該程序將輸出:
 Main joining
 Checking for empty
有兩個重要的地方需要指出。第一,正常情況下System.gc()不需要明確地調用。但是因爲WeakTest是一個非常輕量級的程序,它不需要使用更多的內存,因此明確地調用垃圾回收機制是必要的。第二,注意到new String("Scott")這一行,你可能會問爲什麼不直接使用"Scott"而需要new呢?答案是如果你不使用new,那麼作爲map的鍵的該字符串在系統的字符串常量池中有一個引用。這將不會移除,所以弱引用也不會釋放。爲了解決這個問題,需要使用new創建一個特定的引用去引用字符串常量池中的引用。字符串的內容不會重複。它們保留在常量池中。這只是簡單地創建了一個單獨的指針指向該字符串。
發佈了100 篇原創文章 · 獲贊 4 · 訪問量 9793
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章