2012-02-21 22 views
4

私は.NETのガベージコレクションに関する読書をいくつか行ってきましたが、私はいくつかの説明を希望していました。だから、私が共有共有クラス変数を宣言すればそれを理解するので、GCは決してそれを取り除くことはありません。これは正しいです?共有変数とガベージコレクション

さらに、プライベート変数は何ですか?次の例をご覧ください:

public class myClass 
    private shared myString As String 

    public sub ChangeString(newString As String) 
     myString = newString 
    end sub 
end class 

クラスのインスタンスがない場合、共有変数はGCedになりますか? ChangeStringを共有サブとして変更するとどうなりますか?

答えて

5

パブリック共有クラス変数を宣言すると、わかりましたので、GCは決してそれを取り除きません。これは正しいです?

ほぼ。 GCは、共有変数が参照する文字列をクリーンアップしません。

ただし、新しい文字列でChangeStringを呼び出した場合、myStringが指す文字列はこの参照にルートされなくなり、GCの対象となる可能性があります。しかし、新しい文字列(newStringによって参照される)は、myString変数によってルーテッドになり、ガベージコレクションから保護されます。

クラスのインスタンスが存在しない場合、共有変数はGCedになりますか?

いいえ共有変数はオブジェクトをルートにします。これは、クラスの「型」によって所有されているためです。インスタンスではありません。

ChangeStringを共有サブに変更するとどうなりますか?

これはまったく効果がありません。

2

スタティック(共有)変数は常にルートと見なされます。スレッド静的(共有)変数は、所有スレッドのルーツです。したがって、これらの変数が参照するものは、GCによって決してクリーンアップされません。

クラスのインスタンスが存在しない場合、共有変数はGCedになりますか?

したがって、静的コンストラクタが呼び出された場合は、関連する存続期間(静的プロセスとスレッド静的スレッドのいずれか)で参照が永続します。クラスのインスタンスがあるかどうかは関係ありません。重要なことは、静的コンストラクターが実行されたかどうかです(これは多少非決定的です。静的メンバーが必要な場合は、前に作成されます彼らが必要とされるのは初めて)。

ChangeStringを共有サブに変更するとどうなりますか?

これは問題ではありません。

2

共有変数はクラス自体に存在するため、変数の生存にクラスのインスタンスが不要なため、文字列はガベージコレクションされません。

変数がプライベートであるかどうかは関係ありませんが、それでもガベージコレクションは行われません。変数の設定にシャードされたメソッドまたはインスタンスメソッドを使用するかどうかは関係ありません。

注:ガベージコレクタは変数を収集することはなく、オブジェクトのみを収集します。

2

Shared可変参照は、アプリドメインに根ざしています。アプリケーションドメインがまだロードされている限り、その変数によって参照されるオブジェクトはどれも根付いているので、GCはそのオブジェクトを含むクラスのインスタンスの数に関係なく、そのオブジェクトを収集しません。ただし、特定の例でChangeStringを使用して参照を変更すると、古いオブジェクトはルートされなくなり、コレクションに適格になります。

myStringによって参照されるオブジェクトは、高度なアプリケーションドメイン管理を行っていない限り、myString変数を再設定してそのオブジェクトの参照を停止しない限り、コレクションの対象になりません。