2012-04-06 37 views
4

來自jlibs的RuntimeUtil.java中的以下片段可確保GC完成垃圾回收。因爲,它也使用System.gc(),我不明白他們如何保證它會發生100%的時間。Java:使用jlibs保證垃圾回收

以下是摘錄:

/** 
    * This method guarantees that garbage collection is 
    * done unlike <code>{@link System#gc()}</code> 
    */ 
    public static void gc(){ 
     Object obj = new Object(); 
     WeakReference ref = new WeakReference<Object>(obj); 
     obj = null; 
     while(ref.get()!=null) 
      System.gc(); 
    } 

回答

4

從我可以看到它應該工作,因爲他們

1)創建一個對象 2)得到一個「弱」引用它 3)空爲了標記它爲垃圾收集 4)並等待while循環,直到它實際上消失

5

它與有關強參考文獻 & 關於Garbae Collection的弱引用

強引用是一種普通的Java引用,您每天都會使用這種引用。

如果一個對象通過一系列強引用(強烈可達)到達,它不符合垃圾回收的條件。由於您不希望垃圾收集器破壞您正在處理的對象,因此這通常正是您想要的。

一個弱引用,簡而言之,是一個不足以強制對象留在內存中的引用。弱引用允許您利用垃圾收集器的能力來確定可訪問性

指向類中的gc()方法適用於此概念。

 /** 
     * This method guarantees that garbage collection is 
     * done unlike <code>{@link System#gc()}</code> 
     */ 

     public static void gc(){ 
      Object obj = new Object(); 
      WeakReference ref = new WeakReference<Object>(obj); 
      obj = null; 
      while(ref.get()!=null) 
       System.gc(); 
     } 

一旦WeakReference開始返回null,它指向的對象就變成了垃圾,WeakReference對象幾乎沒用。這通常意味着需要進行某種清理;

這就是爲什麼他們保證它會發生100%的時間。

2

對System.gc()的單個調用不保證所有有資格進行垃圾回收的對象都被重新聲明。請參閱How to cause soft references to be cleared in Java?

在這種情況下,垃圾收集會多次運行,直到弱對象ref返回null。我懷疑這種方法的有效性。將會有許多其他物體可能被垃圾收集。對我而言(jlib)沒有任何可以借鑑的東西。

例如在寫於2009年的庫中的代碼(提取)

/** 
    * This method guarantees that garbage colleciton is 
    * done after JVM shutdown is initialized 
    */ 
    public static void gcOnExit(){ 
     Runtime.getRuntime().addShutdownHook(new Thread(){ 
      @Override 
      public void run(){ 
       gc(); 
      } 
     }); 
    } 

爲什麼你需要GC時調用關閉?引用的圖書館是純粹的垃圾。

+0

確保所有終結器已運行? – 2012-06-27 20:06:48