c# - GC.Collect() 和 PerformanceCounter

标签 c# .net memory-leaks odp.net performancecounter

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

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

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

float mem = p.NextValue();

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

最佳答案

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

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

A number that is the best available approximation of the number of bytes currently allocated in managed memory.

之后,您可以比较这两个值。如果重复执行此操作,您可以看到该对象是否真的在泄漏托管内存。

当然,如果对象泄漏非托管内存,这对您没有帮助。

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

关于c# - GC.Collect() 和 PerformanceCounter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406054/

相关文章:

c# - 防止使用 datacontractjsonserializer C# 序列化属性

.net - .NET 3.5 运行进程的内存分析

c# - 实体更新不工作,更新过程中没有错误。

c# - 如何创建到另一个服务器 (URI) 的 Http 请求并同步调用它

c# - 从基类获取子类

c# - 使用 C# 在多个浏览器中运行 Selenium 测试

c# - Plinq、Cores 和 WithDegreeOfParallelism?

c# - 是否可以检测两种可能的文本文件编码?

c++ - 向图形添加边时占用大量内存

ios - 在 Swift 中使用 UIAlertController 的内存泄漏