2009-05-12 12 views

答えて

19

静的変数で参照されるオブジェクトは、AppDomainがガベージコレクトされたときにのみガベージコレクションされます。クライアントアプリケーションでは、多くの場合、処理の間中存続する単一のAppDomainが存在します。 (アプリケーションは、プラグイン・アーキテクチャーを使用する場合は例外である - 。異なるプラグインは異なるAppDomain Sにロードされてもよく、AppDomainは後アンロードされてもよい)

ASP.NETで、「AppDomainリサイクル」は、(定期的に起こりますさまざまな理由で) - これが発生し、その中の静的変数がGCルートとして機能しなくなり、オブジェクトがガベージコレクションされないようになります。

静的変数を使用してオブジェクトを参照している間にオブジェクトがガベージコレクションされることが心配だった場合は、リラックスすることができます。オブジェクトにアクセスすることはできますが、ガベージコレクションは行われません。

+0

これは大きな非効率性を作りませんか?私はしばしばプライベートな静的ヘルパーメソッドを作成します。または、すべての拡張メソッド。私はこれらの消費量をどれだけ記憶しているのだろうか?オブジェクトのヘルパーメソッドがある場合、ヘルパーをインスタンスとして残して収集する方が良いでしょうか? –

+0

@ P.Brian.Mackey:静的メソッドがある場合、どのメモリが消費されていると思いますか?静的な*変数*がある場合は、グローバルな状態になっていることがあります。しかし、方法自体は別の問題です。 –

+0

私の間違い。変数のようにスタック/ヒープ上にメソッドを作成すると仮定しました。どうやらそれはそうではありません。 –

5

メンバーは収集されません...オブジェクトはあります。
したがって、Ref。 staticメンバをnullに入力すると、以前に指していたオブジェクトがすべて収集されます。そうでない場合は、AppDomainがダウンするまでハングアップします(各AppDomainには静的なものがあります)

0

参照型への静的メンバは参照であり、インスタンスを指しても指していなくてもかまいません。それがインスタンスを指している場合、前記インスタンスは、静的メンバーがアンロードされるまで収集されない。型が特定のAppDomainに読み込まれている場合は、アンロードできます。それ以外の場合は、アプリケーションが終了したときにのみ発生します。

1

短い答え...いいえ、現在の.NETガベージコレクタのすべての実装では、静的クラスメンバフィールドの強い参照が関連付けられているアプリケーションドメインが破棄されるまで、静的クラスメンバフィールドによって強く参照されるオブジェクトは収集されません。

答えが長くなる...潜在的にはい、ガベージコレクタは、オブジェクトへの参照(強または弱)ではなく、オブジェクトの到達可能性に関するオブジェクトを収集するという決定に基づいています。理論的には、ガベージコレクタが、コードが特定のポイント以降で特定のオブジェクトを再度必要としない(つまり、オブジェクトがコードパスから到達できない)と判断できる場合、GCはそのオブジェクトを収集することができます静的クラスメンバーフィールドによって強く参照されていた場合オブジェクトへの参照を保持する静的なクラスメンバフィールドへのアクセスを試みるコードはないので、これは気付かないので完全に許可されています。あなたが尋ねるかもしれない、なぜ私はそれを保持している強い参照のいずれかを介してオブジェクトに再びアクセスするつもりはない場合、私は気にしますか?気になる理由は副作用です。たとえば、静的なクラスメンバフィールドに、非管理対象リソースを表すSafeHandleオブジェクトへの参照を割り当てることによって、SafeHandleオブジェクトが決して閉じられず、したがって、それが生きている管理されていない「オブジェクト」を保持することが想定されます。これはGCの現在の実装でのみ当てはまります。 GCの将来の実装は、静的クラスメンバフィールドによって強く参照されるオブジェクトを、残りのプログラムコードのいずれによっても到達できなくなった場合に収集することができる。

関連する問題