2012-10-15 4 views
5

C#で長いTCP接続ソケットサーバーを作成しました。私のサーバーのメモリ内のスパイクが発生します。私はドットネットメモリプロファイラ(ツール)を使用して、メモリリークがどこであるかを検出しました。 Memory Profilerはプライベートヒープが巨大であることを示しており、メモリは以下のようなものであることを示しています(番号は実際ではないので、GC0とGC2の穴は非常に大きく、データサイズは通常です)。GCホールとは何ですか?

Managed heaps - 1,500,000KB 
      Normal heap - 1400,000KB 
       Generation #0 - 600,000KB 
        Data - 100,000KB 
        "Holes" - 500,000KB 
       Generation #1 - xxKB 
        Data - 0KB 
        "Holes" - xKB 
       Generation #2 - xxxxxxxxxxxxxKB 
        Data - 100,000KB 
        "Holes" - 700,000KB 
      Large heap - 131072KB 
       Large heap - 83KB 
       Overhead/unused - 130989KB 
      Overhead - 0KB 

Howerver、GCホールとは何ですか?

「穴」は、割り当てられた2つの インスタンスの間で使用されていないメモリを表します。ヒープが完全に圧縮されていない場合は、 固定インスタンスまたはガベージコレクタの最適化のために、「ホール」が表示されます。私が知りたいのは何

は次のとおりです。

  1. 「穴」2つの割り当てられたインスタンスの種類の間で表示されますか?
  2. どのようなインスタンスが固定されていますか?
  3. ヒープを圧縮する方法は?

誰かが説明できることを願っています。

+2

の記事を参照してください。 – CodesInChaos

+4

"" Holes "は、割り当てられた2つのインスタンス間で未使用のメモリを表します。ヒープが完全に圧縮されていない場合、固定されたインスタンスまたはガベージコレクタの最適化により" [.NETメモリプロファイラのドキュメントから](http://memprofiler.com/onlinedocs/default.htm?turl=managedheaps.htm) – CodesInChaos

+2

なぜこの質問は非常に多くの人が賞賛していますか?著者の質問は明確ではありません。この編集に基づいて、彼は彼が何について話しているか全く分かりません。 –

答えて

4

pinned objectは、メモリ内での移動が許可されていないものです。これは、メモリ内のいくつかの構造体へのポインタを渡す必要があるアンマネージコードで作業するときにしばしば必要となります。ガベージコレクタは、メモリを最大限に管理するために構造体を自由に移動できますが、いくつかのアンマネージコードにその構造体へのポインタを渡し、アンマネージコードが正しい構造体を指していない場合、予期しない動作につながります。

解決策は、そのオブジェクトを移動させてはならないことをGCに伝えるためにそのオブジェクトを「固定」することです。

ヒープを明示的に圧縮することはできません.GCは完全収集または部分収集(LOHを除く)を実行するときにこのようにする必要があります。オブジェクトをたくさん固定すると、これを正常に管理するのが難しくなります。しかしながら。 GCの詳細については、Garbage Collector Basics and Performance Hints

+1

質問者の "TCP接続ソケットサーバー"がその接続を非常に慎重に管理せず、多数の接続を処理している場合、これはネットワーク接続が多数のリソースの原因になる可能性があることに注意してください。固定されたオブジェクト。 –

+0

すべてのソケットは使用後に閉じます。私は、他のいくつかの管理されていないリソースが割り当てられていると思います。 – tianyi

関連する問題