1

マネージ アプリケーションの受け入れテストを作成して、データのロードおよびアンロード時にメモリ リークが発生していないことを確認しています。これが私がやっていることのサンプルコードです:

System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess();
long memoryBefore = process.PrivateMemorySize64;
// Keep creating new projects.
for (int i = 0; i < 100; i++){
   MyApplication.CreateObject();
   MyApplication.UnlaodLastCreatedObject();

   System.GC.Collect();
   System.GC.WaitForPendingFinalizers();
   System.GC.WaitForFullGCComplete();
}

プロセスのメモリ消費量が同じ (+1MB) かどうかをテストするには、次のようにします。

// Refresh the memory statistics
process.Refresh();
Assert.Less((decimal)process.PrivateMemorySize64,(decimal)(memoryBefore + (1024 * 1024)));

このテストは時々ランダムに失敗するため、まったく信頼できないようです。上記のコードに何か問題がありますか? 私のプロセスがメモリをリークしていないかどうかをテストする別の方法はありますか?

編集 失敗はランダムです。以下は私のビルドサーバー出力のスクリーンショットで、時々テストが失敗していることをはっきりと見ることができます。

ここに画像の説明を入力

ありがとうございました。

4

1 に答える 1

2

あなたに役立つかもしれないことが2つあります。GC.WaitForFullGCCompleteまず、メソッドのmsdnを見てください

http://msdn.microsoft.com/pl-pl/library/cc647068.aspx

それは言う、

このメソッド呼び出しの前に、WaitForFullGCApproach メソッドを呼び出して、完全なガベージ コレクションがあることを確認する必要があります。このメソッドを単独で呼び出すと、不確定な結果が生じる可能性があります。

2 つ目は、Finalize メソッドを実装するオブジェクトがある場合、それらは最初のガベージ コレクションでは収集されないということです (freachable queue について少し読んで、Finalize メソッドを持つオブジェクトがどのように機能するかの概要を理解してください)。

于 2012-10-22T08:12:12.487 に答える