2012-04-06 4 views
4

jlibsのRuntimeUtil.javaの次のスニペットでは、ガベージコレクションが行われることが保証されています。Java:jlibsを使用したガベージコレクションの保証

System.gc()も使用しているので、100%時間がかかることをどのように保証することができますか。続き

は抜粋です:

/** 
    * 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に "弱い" 参照を取得)はnullそれを参照してガベージコレクションのためにマークする 4)whileループが実際に消えるまで待機する

5

と関連する強い参照0123ガベコレクションについては、参考文献を参照してください。

強い参照は、通常の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(); 
     } 

弱い参照がnullを返す開始したら、それはゴミと弱い参照オブジェクトとなっているために指されたオブジェクトはかなり無駄です。これは一般的に何らかのクリーンアップが必要であることを意味します。

これは、それが100%発生することを保証する理由です。

2

System.gc()を1回呼び出しても、ガベージコレクションの対象となるすべてのオブジェクトの再要求が保証されるわけではありません。 How to cause soft references to be cleared in Java?

この場合、弱いオブジェクトrefがNULLを返すまで、が何度も実行されます。。私はこのアプローチの有効性を疑う。ガベージコレクションされる可能性がある他の多くのオブジェクトがあります。私にとっては、それ(jlib)には学ぶことが何もありません。例えば

シャットダウンが呼び出されたときにGCを必要とするのはなぜ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(); 
      } 
     }); 
    } 

?問題の引用された図書館は純粋なごみです。

+0

すべてのファイナライザが実行されていることを確認しますか? –

関連する問題