我的一位同事确信Oracle的odp.net ado.net实施中存在内存泄漏。他编写了一个测试程序来测试这个理论,并在调用每个对象上的dispose之后执行以下操作,以确定释放了多少内存:
PerformanceCounter p = new PerformanceCounter("Memory", "Available Bytes");
GC.Collect();
GC.WaitForPendingFinalizers();
float mem = p.NextValue();
然后将得到的性能值与处理对象之前检索的值进行比较。这会产生准确的结果吗?
答案 0 :(得分:2)
我认为最好的方法是使用GC.GetTotalMemory(true)
。您可以在分配对象之前调用它来记录当前分配的内存量。然后你创建你的对象,可能对它执行一些操作,处理它,确保没有对它的引用(可能只是将局部变量设置为null
),然后再次调用它。
保留可能返回的值可能不完全准确,根据文档,该方法将返回:
一个数字,是当前在托管内存中分配的字节数的最佳可用近似值。
之后,您可以比较这两个值。如果反复执行此操作,则可以查看对象是否实际泄漏了托管内存。
当然,如果对象泄漏了非托管内存,这对你没有帮助。
另一种选择是使用内存分析器,但如果您知道内存可能泄漏的位置,那么这可能是一种过度杀伤。