-1

データベース仕様から動的にコントロールをロードする C# winform アプリケーションを作成しました。私は Split コンテナー Panel を使用しています。の「canvasForm」が作成され、クリックごとに panel2 に配置されます。アプリケーションは正常に動作しています。しかし、問題は、メニューフォームをクリックしても、キャンバスフォームのオブジェクトの数が作成され、ガベージコレクターが収集されず、そのプロジェクトのプロセスのメモリが同時に増加し、Windowsの「タスクマネージャー」で確認できることです。この問題を解決するにはどうすればよいですか? .

例:アプリケーションを起動した場合、メニューを選択するためにメニューフォームで回数をクリックすると、Windowsタスクマネージャーに17,572 Kのようなプロセスメモリが表示されます。アプリケーションを継続的に使用すると、タスクマネージャーに18,972 Kが表示され、メモリオーバーフローが発生する可能性があります。

4

1 に答える 1

2

ガベージ コレクターは、定義上、非決定論的です。これは、その動作を直接制御することはできませんし、そうするつもりもないことを意味します...そうすることは、.NET ランタイムが自動的にメモリを管理していなかったことを意味します。のような特定の呼び出しを行うことができますがGC.Collect()、これはお勧めしません。.NET フレームワークは、必要に応じてメモリを解放します。

メモリ使用量に問題がある場合は、コードの問題を調査して修正する必要があります。Gen 2 に到達するオブジェクトが多数ある場合、収集に時間がかかるため、メモリが膨張します。あなたの目標は、新しいオブジェクトを作成しないか、Gen 0 または 1 (ここでは 0 の方が 1 よりも優れています) で収集される存続期間の短いオブジェクトを作成することです。コードを評価して改善し、問題を減らします。

これらすべてに加えて、ここが難しいところですが、タスク マネージャーで報告されるメモリは、アプリケーションで使用されているメモリではなく、.NET ランタイムのヒューリスティックによってアプリケーション用に予約されているメモリです...

詳細については、これをお読みください: .NET ガベージ コレクション

于 2013-07-19T12:40:59.143 に答える