2012-04-27 25 views
0

C#.Net 3.5で開発されたソケットサーバーがあります。私は、クライアントが切断して接続するたびにサーバのメモリ使用量が増加することを知っています。有効な資格情報が提供されていない場合、サーバーはクライアントの接続を切断します。ソケットサーバーのメモリが増え続ける

クライアントが無効な資格情報で接続しようとすると、より多くのメモリが予約され、一度も放棄されたことはありません。クライアントは毎秒1回再接続しようとしています。以下は、切断を処理するコードです。このコードは、クライアントの接続が切断され、読み書き操作でエラーが発生するたびに呼び出されます。

誰かがこの問題をデバッグ/修正する方法を教えてくれますか?

+0

クライアントごとに1つのスレッドを使用していますか?あなたがソケットとストリームの置換/閉じるを呼び出す場合、あなたはうまくいくはずですか?それ以外の場合は、メモリプロファイラを使用することをお勧めします。 – weismat

答えて

0

state.workSocketとstateをnullに設定している可能性がありますが、処分する機会はありません。

+0

はい、nullに設定することで決して処分されません。 –

+0

それはどちらもうまくいきませんでした。 – dabididabidi

+0

Windowsサービスである私達のソケットサーバーにはカスタムパフォーマンスカウンタがあり、ソケットサービスの起動時に初期化されます。サービスが開始されると、クライアント接続を受け入れ、カスタムのパフォーマンスカウンターを使用して接続/切断されたクライアントの合計数、合計バイト数、合計バイト数などを格納します。私の推測は、ソケットが閉じられたとき、カウンターは、増加する記憶を続けさせている。パフォーマンスカウンターを使わずにソケットサービスを実行しようとしましたが、メモリが増えていて、いつか後になってしまいます。 – dabididabidi

0

どのようにメモリ使用量を測定していますか?

マシンにメモリが残っていないと、GCは頻繁にコレクションを実行しません。タスクマネージャに表示されるメモリ使用量は、メモリが廃棄されても上昇します。

GC.Collectコールを追加して強制的にGCを実行してみてください。実際にメモリがリークしている場合に表示されます。 (本番環境でCollectコールを残さないでください)。

MSDNの記事:Memory Usage Auditing For .NET Applications