我正在为托管应用程序编写验收测试,以确保在加载和卸载数据时不会泄漏内存。 以下是我正在做的示例代码:
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)));
这项测试似乎根本不可靠,因为它随时会随机失败。 上面的代码有什么问题吗?是否有不同的方法来测试我的进程是否没有泄漏内存?
修改 失败是随机的,下面是我的构建服务器输出的屏幕截图,您可以清楚地看到测试失败。
谢谢。
答案 0 :(得分:2)
有两件事可能对你有所帮助。首先,查看msdn上的GC.WaitForFullGCComplete
方法
http://msdn.microsoft.com/pl-pl/library/cc647068.aspx
它说,那
此方法调用之前应调用WaitForFullGCApproach方法,以确保您已完成垃圾回收。单独调用此方法可能会产生不确定的结果。
第二件事是,如果你有任何实现Finalize方法的对象,它们将不会被收集在第一个垃圾收集中(你可以阅读一些关于可释放队列的内容,以便更详细地了解使用Finalize方法的对象如何工作)。 / p>