C# GC前后的进程内存消耗

C# GC前后的进程内存消耗,c#,memory-leaks,C#,Memory Leaks,我正在为我的托管应用程序编写一个验收测试,以确保它在加载和卸载数据时不会泄漏内存。 以下是我正在做的工作的示例代码: System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess(); long memoryBefore = process.PrivateMemorySize64; // Keep creating new projects. for (int i = 0; i < 100

我正在为我的托管应用程序编写一个验收测试,以确保它在加载和卸载数据时不会泄漏内存。 以下是我正在做的工作的示例代码:

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();
}
这种测试似乎根本不可靠,因为它有时会随机失败。 我上面的代码有什么问题吗?是否有其他方法来测试我的进程是否没有泄漏内存

编辑 失败是随机的,下面是我的构建服务器输出的屏幕截图,您可以清楚地看到测试失败的时刻


谢谢。

有两件事可能对你有帮助。首先,查看msdn for
GC.WaitForFullGCComplete
方法

上面说,

此方法调用之前应先调用WaitForFullGCApproach方法,以确保已完成完整的垃圾收集。单独调用此方法可能会产生不确定的结果


第二件事是,如果您有任何实现Finalize方法的对象,它们将不会在第一次垃圾收集中被收集(您可以阅读一些关于freachable队列的内容,以获得更多关于Finalize方法对象如何工作的概述)。

@MarcGravel请查看我的编辑。是的,但是“我的测试失败”是什么意思?偏差有多大?在运行时会发生很多其他事情-一些增长,特别是在应用程序开始时,并非意外(程序集加载、序列化程序集生成/加载、字符串插入等)。我认为您应该使用内存分析器,它将有助于突出显示您想要的代码部分!
// Refresh the memory statistics
process.Refresh();
Assert.Less((decimal)process.PrivateMemorySize64,(decimal)(memoryBefore + (1024 * 1024)));