8

我的一位同事确信 Oracle 的 odp.net ado.net 实现中存在内存泄漏。他编写了一个测试程序来测试这个理论,并在对每个对象调用 dispose 后执行以下操作以确定释放了多少内存:

PerformanceCounter p = new PerformanceCounter("Memory", "Available Bytes");

GC.Collect();
GC.WaitForPendingFinalizers();

float mem = p.NextValue();

然后将得到的性能值与在处理对象之前检索到的值进行比较。这会产生准确的结果吗?

4

1 回答 1

2

我认为最好的方法是使用GC.GetTotalMemory(true). 您可以在分配对象之前调用它来记录当时分配了多少内存。然后你创建你的对象,也许对它执行一些操作,处理它,确保没有对它的引用(可能只是将局部变量设置为null),然后再次调用它。

请注意,返回的值可能不完全准确,根据文档,该方法将返回:

一个数字,它是托管内存中当前分配的字节数的最佳可用近似值。

之后,您可以比较这两个值。如果您重复执行此操作,您可以查看对象是否实际上正在泄漏托管内存。

当然,如果对象泄漏非托管内存,这将无济于事。

另一种选择是使用内存分析器,但如果您知道内存可能泄漏的确切位置,这可能有点过头了。

于 2012-05-02T03:00:32.343 回答