0

プロジェクトの概要:

私は比較的若いプログラマーです。私のアプリケーションは、.net 3.5C#.netを使用して作成され、VS2008それを対象としています。これは、(私の基準では) 約 200 フォーム + 30 クラスと 50K 行のコードのかなり大きなプログラムです。プログラムの一部は、テキスト ファイルからデータをインポートし、一連の計算を行い、結果を Access データベースに書き込みます。

テキスト ファイルの行数によっては、インポート プロセスに 20 分以上かかることがよくあります。最終的に、プログラムがクラッシュし、「エラー作成ウィンドウ ハンドル エラー - 常にコード内の別の場所にあります。実行すると、継続的に遅くなるようです。(ページングの問題でしょうか?) 私の OS は XP w/SP3 です。 , 32 ビット, 3Gig RAM 問題がある場合. この問題は、4Gig の RAM を搭載した私の W7 64 ビット マシンでも発生します。

エラーを読み、タスク マネージャーでいくつかの検出作業を行ったところ、明らかにメモリ リークが発生しています。これが私が集めたデータの一部です。

startup - memory usage = 48M / Handles = 428 / Threads = 17 / User Objects = 111

1 minute memory usage  = 65M / Handles = 520 / Threads = 22 / User Objects = 523

2 minutes memory usage = 81M / Handles = 520 / Threads = 19 / User Objects = 952

3 minutes memory sage = 98M / Handles = 510 / Threads = 19 / User Objects = 1359

4 minutes memory usage = 113M / Handles = 510 / Threads = 18 / User Objects = 1766

これは、プログラムがクラッシュするまで続きます..

Webで答えを探すことから。ハンドルの数が増えて問題が発生することを期待していました。問題は、ユーザー オブジェクトの数がメモリを食い尽くしていることであり、それが最終的にクラッシュを引き起こしている可能性がありますか? クラッシュが発生したときのメモリ使用量は、通常 450M から 600M の間です。

データ処理プロセス中に複数回呼び出すクラスの 1 つに .Dispose() コードを追加しようとしましたが、効果はありませんでした。(私のやり方が下手だったからかもしれませんが…)

  1. オブジェクト数/メモリ使用量の増加が問題の原因ですか?
  2. どのユーザー オブジェクト (クラスまたはフォーム) が成長しているかを調べるにはどうすればよいですか?
  3. 見つかったら、どうすれば修正できますか?

どんなアドバイスでも大歓迎です。

4

2 に答える 2

0

メイン フォーム - 子フォーム (または MDI フォーム) 構造を使用し、メイン フォーム イベントに登録している場合、閉じた子ウィンドウが永久に存続する可能性があります。

また、メモリ プロファイラーを使用して、過剰に作成されたオブジェクトを確認することもできます。

于 2013-03-27T14:37:08.593 に答える
0

ANTS Memory Profiler などのメモリ プロファイラを使用することをお勧めします。どのオブジェクトが成長しているかを正確に追跡するために、私はそれを使用して大成功を収めました。

無料試用版と開始するためのウォークスルーがあります。また、.NET メモリ リークに関する理解を深める優れたテクニカル ペーパーもいくつかあります。

于 2013-03-27T14:56:43.703 に答える