7

ガベージコレクターを使用して静的変数の参照、Javaのメソッドの割り当てを解除するにはどうすればよいかを理解するためのサンプルデモプログラムを作成しています。

ガベージコレクターを妨げないために弱参照を使用しています。

クラスSample

public class Sample {

    private static String userName;
    private static String password;
    static {
        userName = "GAURAV";
        password = "password";
    }
    public static String getUserName(){
        return userName;
    }
    public static String getPassword(){
        return password;
    }
}

クラスUser

import java.lang.ref.WeakReference;

public class User {

    public static void main(String[] args) {
        /**
         * Created one object of Sample class
         */
        Sample obj1 = new Sample();
        /**
         * I can also access the value of userName through it's class name 
         */
        System.out.println(obj1.getUserName()); //GAURAV
        WeakReference<Sample> wr = new WeakReference<Sample>(obj1);
        System.out.println(wr.get());  //com.test.ws.Sample@f62373
        obj1 = null;
        System.gc();
        System.out.println(wr.get()); // null
        /**
         * I have deallocate the Sample object . No more object referencing the Sample oblect class but I am getting the value of static variable. 
         */
        System.out.println(Sample.getUserName()); // GAURAV
    }

}
4

4 に答える 4

21

静的フィールドは、個々のインスタンスではなく、クラスに関連付けられています。

静的フィールドは、クラスを保持するClassLoaderがアンロードされるときにクリーンアップされます。多くの単純なプログラムでは、それは決してありません。

フィールドをインスタンスに関連付けてクリーンアップする場合は、インスタンスをクリーンアップし、静的フィールドではなくインスタンスフィールドにします。

于 2012-10-29T17:50:05.410 に答える
5

プログラム以外で、あなたの質問に答えるために

  1. いいえ。メソッドはそもそもヒープに存在しないため、ガベージコレクションされません。

  2. 静的変数はClassインスタンスに属し、ロードされるとガベージコレクションされません(ほとんどの一般的なクラスローダーの場合)

于 2012-10-29T17:49:48.380 に答える
4

System.gc()は、ガベージコレクターの実行を強制しません。ガベージコレクターを実行するのにおそらく良い時期であるというのは、JVMへの単なる提案です。この質問を参照してください-System.gc()はいつ何かをしますか

于 2012-10-29T17:42:37.017 に答える
3

System.gc();これはガベージコレクタを呼び出さないことを理解する必要があります。GCにゴミを取り除くように丁寧に頼むだけです。GCは、何をいつ開始するかを決定します。したがって、呼び出したり、変数System.gc();に割り当てたりするときに、すぐに効果が見られるとは思わないでください。null

GCは、どのような方法でもアクセスできないすべてのオブジェクトを削除します。したがって、変数が定義されたブロックをコードが終了した場合、オブジェクトを削除できます。nullを割り当てると、参照が削除されます。弱参照は、GCによるオブジェクトの削除を妨げません。

この説明がお役に立てば幸いです。

于 2012-10-29T17:44:13.413 に答える