2011-08-19 5 views
9

固定されたオブジェクトが「途中」にある場合、GCがメモリを圧縮できないため、管理されたヒープの固定オブジェクトが.NETのGCパフォーマンスに影響することがあります。しかし、ラージオブジェクトヒープは、とにかく圧縮されていないので、LOHのオブジェクトには適用しないでください。 LOHにあるオブジェクトを固定するための他の隠されたコストはありますか?または、GCパフォーマンスを低下させることなくLOH内のオブジェクトを安全にピン止めすることはできますか?LOHのオブジェクトを固定するとGCのパフォーマンスに影響しますか?

答えて

5

大きなオブジェクトヒープ(LOH)が圧縮されていないという理由は、が収集されていないことを意味するものではありません。The LOH is collectedオブジェクトを固定すると、将来の割り当てに影響が出ます。

オブジェクトは固定されているため、LOHで使用可能なメモリ量を効果的に縮小します(参照を保持している場合と同じです)。ラージオブジェクトを割り当てる別の要求が行われたときに、LOHに固定された/保持されている参照が多すぎると、より大きなラージオブジェクトを割り当てる問題に遭遇する可能性があります。

ガベージコレクションのマークアンドスイープの部分でマークが行われると、CLRはおそらくのすべての参照をルートとして固定しているので、コレクションのこの部分では影響がない可能性があります。誰かが大きなオブジェクトへの参照を保持していた場合、同じ方法で動作します。

割り当て解除はLOH上で同じように行われます(ブロックは単に使用可能であるとタグ付けされているため)、この操作は影響を受けません。

最後に、LOHが圧縮されていないため、この操作はGC中にこのヒープ上で行われることはありませんので、ここでは影響を受けません。

要約すると、LOHの割り当てはの間ではっきりとになる可能性がありますが、LOHのオブジェクトへの参照は固定されている可能性があります。

大容量のメモリブロックを割り当てて保持することは、システム全体に影響を与える可能性があることを忘れてはいけませんが、これらのコメントは、厳密にはLOHについてのです。

+0

回答ありがとうございます。私は2番目の段落を得るのか分からない:ピンニングは参照を保持するよりも利用可能なメモリを縮小するのはなぜですか?私はいつもLOHに何かを割り当てることは、本質的に、十分な大きさの空きメモリブロックを探したり、新しいセグメントを割り当てることを意味しました。もしそうなら、どんなライブブロックも同じように扱われるべきです。 – Niki

+0

@nikie:これ以上はありません。あなたが述べたのと同じ効果があります。私はそれに応じて私の答えを更新しました。これは小さくても重要な変更です。 – casperOne

関連する問題