4

jlibs のRuntimeUtil.javaからの次のスニペットは、ガベージ コレクションが行われることを GC に保証します。

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

3 に答える 3

5

Garbae Collection に関しては、 Strong ReferenceWeak Referenceに関連しています。

強参照は、日常的に使用する通常の 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% 発生することが保証されています。

于 2012-04-06T05:40:09.073 に答える
4

私が見ることができるものから、それは彼らのように機能するはずです

1) オブジェクトを作成する 2) オブジェクトへの「弱い」参照を取得する 3) オブジェクトへの参照を null にして、ガベージ コレクションの対象としてマークする 4) 実際に消えるまで while ループで待機する

于 2012-04-06T05:33:20.970 に答える
2

System.gc() を 1 回呼び出しただけでは、ガベージ コレクションの対象となるすべてのオブジェクトが再利用されるとは限りません。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 が必要なのはなぜですか? 問題の引用されたライブラリは純粋なゴミです。

于 2012-04-06T06:04:35.430 に答える