2

2つのフォームをコンテナ化する中規模のアプリケーションがあります。アプリケーションを開くと、最初のフォームに移動し、約17MBを消費します。次に、2番目のフォームを開き、最初のフォームを閉じます。約57MBが消費されています。2番目を閉じて、最初の33mbを再度開きます。最初の66mbを閉じて、2番目の66mbを再度開きます。このメモリが回収されないのはなぜですか?これが、現在のフォームを閉じて新しいフォームを開くために使用するコードです。

private void honButton_Click(object sender, EventArgs e)
{
    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));

    this.Close();
    this.Dispose();

    t.Start();
}


 public static void ThreadProc()
 {
    Application.Run(new Form1());
 }
4

2 に答える 2

1

メモリが再利用されていない場合は、ガベージコレクタがまだメモリを収集することを選択しなかったことが原因である可能性があります。

GCは.NETでは決定論的ではありません。

実際、私は積極的にメモリを割り当てる(非常に大きなデータ構造を処理する)アプリを作成しました。このアプリは、プロセスで使用可能な仮想アドレス空間がほぼ使い果たされるまでメモリの解放を開始しません)。

GCを実行するタイミングは、使用しているガベージコレクター(サーバーとワークステーション)、.NETの実装、およびアプリケーションのメモリ使用量プロファイルによって異なります。

于 2012-05-29T01:31:48.063 に答える
0

プロファイリングツールを使用して、メモリ使用量またはWindowsタスクマネージャーを確認していますか。タスクマネージャは、アプリケーションのメモリ使用量を確認するのに適した場所ではありません。perfmonプライベートバイトなどのプロセスメトリックを使用します。

于 2012-05-29T07:50:19.650 に答える