1
  1. WeakReferences が入力された辞書があります。
  2. Web サービス A: オブジェクトを作成し、弱参照ディクショナリに配置します。(1)
  3. Web サービス A は、強い参照を持つオブジェクトを保持する場合と保持しない場合があります。

私の問題:

弱参照ディクショナリから削除すべきオブジェクトを追跡できません。これは、ガベージ コレクターがオブジェクトをすぐに収集せず、ランダムで予測不可能な時間が経過した後にのみ収集されるためです。

動作に一貫性がありません。たとえば、

例 1: 期待どおりに動作し、変数 ex1 がすぐに収集されます。

Sub Example1(id as integer)
Dim ex1 as new Object
dim t as new WeakReference With {.target = ex1};
WeakReferenceDictionary.add(id,ex1)
End Sub<br>

例 2 'これは機能しません。ext1 はすぐに収集されません

Sub Example1(id as integer)
  Dim ex1 as new Object
  dim t as new WeakReference With {.target = ex1};
  WeakReferenceDictionary.add(id,ex1)

  otherclass.refObject = ex1
  otherclass.refObject = Nothing

End Sub<br>

私が試してみました。
Module1 内に WeakDictionary を配置します (コンソール アプリケーションです)。
GC.Collect
GC.Collect(0)
GC.Collect(1)
GC.Collect(2)

私の質問。とにかく、アプリケーションのパフォーマンスが低下する場合でも、本当にガベージ コレクションを強制する必要がありますか。ロジックの目的で GC を使用するべきではないことはわかっていますが、私のソリューションでは、このようにすると非常に便利です。

4

2 に答える 2

2

この投稿は免責事項から始めます。ガベージ コレクションの内部構造は保証されておらず、予測不可能であり、現在動作するようにテストされていても、コードが .NET で壊れる可能性があるため、ガベージ コレクションの内部構造に依存することで正しいアプローチを選択したことに非常に懐疑的です。パッチリリース。

オブジェクトが収集されなかった理由は複数あります。

  1. デバッガーで実行しているか、デバッグ モードでビルドしています。これにより、オブジェクトの有効期間が少し延長されます (JIT は変数の内容を未使用として積極的にマークしないため、スコープ外に出た場合でも変数をデバッグできます)。
  2. GC.Collect 呼び出しを間違った場所に配置する
  3. オブジェクトにはWaitForPendingFinalizersがありますが、WaitForPendingFinalizersを呼び出しませんでした

他の理由もあるかもしれません。

では、これを修正する方法は?GC に頼らないでください。Dispose の実装と呼び出し、または参照カウント手法への切り替えなどの決定論的なアクションに依存します。

于 2012-09-07T21:18:19.227 に答える