2012-01-25 15 views
3

私は最近、GC.AddMemoryPressureを使用する必要がありました。それは、メモリ圧力を引数として追加するオブジェクトを受け入れないという奇妙なものです。私は、それがランタイムに非常に密接に結びついているので、thisポインタがメソッドに渡されるいくつかのメカニズムがあると思います。私の質問は3つです:GC.AddMemoryPressure()はどのオブジェクトにメモリ圧迫を加えるべきかを知っていますか?

  1. このポインタはどのようにしてメソッドに渡されますか?
  2. 静的メソッドから呼び出すときに例外がスローされないことに気付きました。この場合、どうなりますか?
  3. なぜGC.SupressFinalizeやGC.ReRegisterForFinalizeなどの他のGCメソッドは、このメソッドが必要でないオブジェクト引数を取るのですか?

答えて

1

いいえ、特定のオブジェクトに明示的に関連付けられていません。仮定は、廃棄/ファイナライズの時間に、同じオブジェクトがその圧力を取り除くということです。 the docs

最も単純な使用パターンでは、管理対象オブジェクトがコンストラクタ内でアンマネージメモリを割り当て、DisposeまたはFinalizeメソッドで解放します。アンマネージメモリを割り当てた後にAddMemoryPressureメソッドを呼び出し、解放後にRemoveMemoryPressureメソッドを呼び出します。

さらに複雑なシナリオでは、メモリの負荷が時間とともに変化する可能性がありますが、それでも問題のオブジェクトの協力が必要です。

+0

ああ、私は、このメモリ圧迫が管理されていないメモリを割り当てるオブジェクトに関連付けられていると仮定していました。つまり、GCはコレクションのメモリ負荷が高いオブジェクトに優先順位を付けます。 – Grokys

+0

"管理されていないメモリを割り当てた後にAddMemoryPressureメソッドを呼び出す"。割り当ての前にメソッドを呼び出す方が理にかなっていますか?そうしないと、ネイティブ/アンマネージコードは、ガベージコレクタがメモリを必要とするネイティブ/アンマネージコードについて知らないため、割り当て中に不必要にメモリが不足する可能性があります。 –

+0

@ChieltenBrinke:アロケーションの直前に*コールすると、GCの時間をとらえられないと思います。 –

0

AddMemoryPressureは、通常よりも早くガベージコレクタを起動します。それで全部です。インスタンスが収集され、ファイナライザを実行する必要があるときに、そのタイプの特定のコードを非表示にしたり登録したりしないでください...

ガベージコレクタのメイトを読んでみることをお勧めしますIncreaseMemoryPressureを呼び出すか、それを呼び出す可能性が高いため、パフォーマンスが低下します。

+0

大量の管理されていないメモリを割り当てていますが、これはConditionalWeakTableを使用して追跡されます。この場合AddMemoryPressureを呼び出す必要はないとお考えですか? – Grokys

+0

いいえ、それは良い使用です。 RemoveMemoryPressureを正しく呼び出すと仮定します。基本的には、より多くのメモリが使用されていることをGCに伝えます。そのため、メモリを使用して少し積極的にする必要があります。 –

関連する問題