GC之前和之后的进程内存消耗

时间:2012-10-22 07:36:29

标签: 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; 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)));

这项测试似乎根本不可靠,因为它随时会随机失败。 上面的代码有什么问题吗?是否有不同的方法来测试我的进程是否没有泄漏内存?

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

enter image description here

谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

它说,那

  

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

第二件事是,如果你有任何实现Finalize方法的对象,它们将不会被收集在第一个垃圾收集中(你可以阅读一些关于可释放队列的内容,以便更详细地了解使用Finalize方法的对象如何工作)。 / p>