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

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

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

它说,那

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

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

于 2012-10-22T08:12:12.487 回答