プロジェクトの概要:
私は比較的若いプログラマーです。私のアプリケーションは、.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() コードを追加しようとしましたが、効果はありませんでした。(私のやり方が下手だったからかもしれませんが…)
- オブジェクト数/メモリ使用量の増加が問題の原因ですか?
- どのユーザー オブジェクト (クラスまたはフォーム) が成長しているかを調べるにはどうすればよいですか?
- 見つかったら、どうすれば修正できますか?
どんなアドバイスでも大歓迎です。