2010-11-25 19 views
6

管理対象外オブジェクトのAdd/RemoveMemoryPressureを使用する正しい方法は何ですか?私は管理されていないオブジェクトを持っていますが、例えばSTLコンテナを多用しています。アンマネージドオブジェクトの合計サイズが変更されるたびに、マネージドGCを常に更新するはずですか?それとも、生の割り当てサイズですか?そしていつRemoveMemoryPressureを呼び出すのですか?ファイナライザ? Dispose()? hereからGC.AddMemoryPressure for unmanaged objects

+0

ガベージコレクタがアンマネージオブジェクトをどのように収集すると思いますか? – dtb

+1

@dtb:[GC.AddMemoryPressure](http://msdn.microsoft.com/en-us/library/system.gc.addmemorypressure.aspx)は、管理対象オブジェクトが存在し、管理されていないメモリのxバイトを割り当てたままにしていることをランタイムに通知します(例えば、COMオブジェクトへの参照を有することによって)。これにより、ガベージコレクタはデッドオブジェクトを探してファイナライザを実行し、プロセス内の管理されていないメモリを解放することができます。 –

+0

@dtb:所有している管理オブジェクトを収集します。 – Puppy

答えて

2

(及び@Wimクーネンにより指摘):最も単純な利用パターンに

、 管理オブジェクトは、コンストラクタにアンマネージ メモリを割り当てと解放は廃棄それを またはメソッドをファイナライズ。 アンマネージメモリを割り当てた後にAddMemoryPressureメソッド を呼び出し、解放後にRemoveMemoryPressure メソッドを呼び出します。管理対象オブジェクトの 寿命の間、実質的に アンマネージメモリの割り当て 変化、あなたは が にAddMemoryPressureと RemoveMemoryPressureメソッドを呼び出すことができ、より複雑なシナリオでは、

は、これらの増分変更を伝える ランタイムへ。

これらの変更を追跡するためにどれくらいの努力を払うべきか、どれだけの利益が得られるかを決める必要があります。

+0

はい - ネイティブオブジェクトのデフォルトアロケータを変更して、すべての割り当てをマスターオブジェクトに通知し、管理対象コードのDispose()オブジェクトを使用して、すべての管理対象メソッドのGCを自動的に更新しました。 – Puppy