首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GC.Collect()和PerformanceCounter

GC.Collect()和PerformanceCounter
EN

Stack Overflow用户
提问于 2012-05-02 08:07:26
回答 1查看 766关注 0票数 8

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

代码语言:javascript
复制
PerformanceCounter p = new PerformanceCounter("Memory", "Available Bytes");

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

float mem = p.NextValue();

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-02 11:00:32

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

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

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

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

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

另一种选择是使用内存分析器,但如果您确切地知道内存可能泄漏的位置,那么这可能是过度杀伤力。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10406054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档