1

以前のシリーズでは:

OutOfMemoryException、スタック サイズが大きい、スレッド数が多い

多くのメモリを消費する .net Windows サービスがあります。GC ヒープは大きくありません。また、スタックサイズは大きくありません。大きいのはプライベートデータと呼ばれるものです。また、タスク マネージャーで、自分のアプリケーションがタスク マネージャーがハンドルを呼び出すものを大量に消費していることがわかります。私のアプリケーションは 2326 個のハンドルを消費します。これらのハンドルは、プライベート データを占有するいくつかのウィンドウ ハンドルであると思います。このプライベート データは、Thread Environment Blockとしてマークされたブロックによって占有されていることがわかります。それは何ですか?

VMMap によるアプリケーションのメモリ使用量のスクリーンショット

タスク マネージャーによるアプリケーションのメモリ使用量のスクリーンショット

アップデート

ProcessExplorer を実行します。現在、サービスの 2 つのインスタンスを実行しています。Gen2 GC の仮想メモリを大量に消費していることがわかります。この見た目は疑い深い。また、GC ヒープ サイズに予約されている合計は、2 つのプロセスで同じです。

代替テキスト

4

2 に答える 2

2

新しく作成されたオブジェクトがガベージ コレクションのルートから参照されているために収集できない場合、古典的なメモリ リークが発生しているようです。

このような問題を解決する最も効果的な方法は、WinDBG + SOS と !gcroot コマンドを使用することです。メモリ リークのバグ調査の例は、http: //blogs.msdn.com/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspxにあります。

幸運を!

于 2010-03-31T11:23:13.507 に答える
1

はい、かなりのリソースを浪費します。[ThreadStatic] 属性でマークした変数を推測しています。スレッドが多すぎます

于 2010-03-31T10:25:34.473 に答える