2010-12-01 15 views
0

実際には、複数のスレッドを持つリアルタイムアプリケーションを開発中です。Windowsマルチスレッドアプリケーションでメモリリークを解決する方法

私のアプリケーションメモリは65Mbですが、子MDIフォームを開くとメモリは85MBに増えますが、子ウィンドウを閉じるとメモリは85MBに残ります。

私はDisposeを使いましたが、すでにGC.Collect()で試してみましたが、これらのどれも私の問題を解決しませんでした。 この問題に関してちょっと混乱しています。

これについて私に教えてもらえますか?

ありがとうございます。

+0

親切にコードスニペットを投稿してください。あなたが見落としているものがあるかもしれません。 – basarat

+0

必要に応じてイベントハンドラを切り離しますか? –

+0

どのようにMDIParent /子ウィンドウの表示を設定しようとしていますか?いくつかのコードを投稿できますか? – Jeff

答えて

2

良いメモリプロファイラーを取得する必要があります。

オプションの束があります。

多くの費用は(CLRプロファイラを除く)、通常は試用版です。

(プロファイラが接続された状態で)アプリを起動した後、リーク前と後で比較する前にメモリのスナップショットを撮って、何が残っているかを確認する必要があります。

問題を引き起こしている可能性のあることがたくさんあるので、あなたのケースでどのような問題が起こっているのかを言うのは難しいです。

0

子MDIフォームでグローバルデリゲート参照を使用しましたか?

0

新しい子ウィンドウを開くたびにメモリが増えますか?その場合は、これらのいくつかを開いて閉じてから、windbgを使用してプロセスに接続します。

sosをロードした後、!dumpheapコマンドを使用してメモリリークの原因を知り、gcrootを使用してリークされたメモリがどこにあるのかを調べることができます。

このブログは役立つかもしれない: ところでhttp://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

、どのようにC#で「リアルタイムアプリケーション」を書いていますか?

0

タスクマネージャのメモリ番号は、それほど鮮明ではありませんが、この小さなトリックはその番号を騙すことができます。

public static void RefreshMemory() { 
    try { 
     Process curProc = Process.GetCurrentProcess(); 
     curProc.MaxWorkingSet = curProc.MaxWorkingSet; 
    } catch { 
     // Handle the exception 
    } 
} 
関連する問題