Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定我的应用程序的哪个部分正在泄漏内存?_C#_Visual Studio 2010_Memory Leaks_Dispose - Fatal编程技术网

C# 如何确定我的应用程序的哪个部分正在泄漏内存?

C# 如何确定我的应用程序的哪个部分正在泄漏内存?,c#,visual-studio-2010,memory-leaks,dispose,C#,Visual Studio 2010,Memory Leaks,Dispose,我在任何支持它的地方都实现了Dispose。我正在删除所有事件处理程序。我没有调用本机代码 我甚至遍历每个字典,将值设置为null,并对所有项调用.Clear() 问题: 我怎样才能知道我的代码在哪里泄漏 我第一次发现漏洞是在测试中运行了一夜。它使用固定数量的内存,因此它应该增长,然后变得有些静态。然后我让前台线程显示内存,如下所示: if (key.KeyChar == 'g') { long pre = GC.

我在任何支持它的地方都实现了
Dispose
。我正在删除所有事件处理程序。我没有调用本机代码

我甚至遍历每个字典,将值设置为null,并对所有项调用.Clear()

问题:

我怎样才能知道我的代码在哪里泄漏

我第一次发现漏洞是在测试中运行了一夜。它使用固定数量的内存,因此它应该增长,然后变得有些静态。然后我让前台线程显示内存,如下所示:

            if (key.KeyChar == 'g')
             {
                long pre = GC.GetTotalMemory(false);
                long post = GC.GetTotalMemory(true);
                Console.WriteLine("{2} Pre:{0}  \tPost:{1}", pre, post, System.DateTime.Now);
                 GC.Collect();
              }

我运行了好几次(在几个小时内,偶尔按一下“g”),发现这个数字在不断增加。

最好的方法是使用内存分析器……有很多选择


追踪此问题的最佳方法是使用内存分析器……有很多可供选择

确保使用

try
{
}
finally 
{ 
   youDisposableObject.Dispose(); 
} 

对于您实现的每个对象“Dispose”

如果不需要对某些对象实现终结器,请删除它们

如果在此之后仍无法修复,则必须使用内存探查器

确保使用

try
{
}
finally 
{ 
   youDisposableObject.Dispose(); 
} 

对于您实现的每个对象“Dispose”

如果不需要对某些对象实现终结器,请删除它们


如果之后仍然无法修复,则必须使用内存探查器。有一篇文章介绍了如何使用SOS.dll和更全面的一篇文章

根据您使用的Visual Studio版本(Premium或Ultimate),您还可以使用常规代码分析工具来帮助查找代码中可能导致内存泄漏的问题。(详情)

当然,在托管代码中,内存泄漏与非托管代码中的内存泄漏略有不同。在非托管代码中,明确分配和取消分配内存,内存泄漏是由于未能取消分配内存造成的


在.NET中,内存泄漏是由于挂在对象上的时间比预期的长。只要尽可能遵循使用该语句的最佳实践,并仔细规划变量的范围,就可以在很大程度上避免这种情况。

有一篇文章介绍了如何使用SOS.dll和更全面的一个

根据您使用的Visual Studio版本(Premium或Ultimate),您还可以使用常规代码分析工具来帮助查找代码中可能导致内存泄漏的问题。(详情)

当然,在托管代码中,内存泄漏与非托管代码中的内存泄漏略有不同。在非托管代码中,明确分配和取消分配内存,内存泄漏是由于未能取消分配内存造成的


在.NET中,内存泄漏是由于挂在对象上的时间比预期的长。只要遵循尽可能使用语句的最佳实践,并仔细规划变量的范围,就可以在很大程度上避免这种情况。

我在c#应用程序中遇到了同样的问题,并使用了(实际上是试用版)的 这很有帮助


仍然需要一些时间来定位发生泄漏的实际代码行。因此,不要期望该工具立即识别罪犯。

我只是在我的c#应用程序中遇到了同样的问题,并使用了(实际上是试用版)的 这很有帮助


仍然需要一些时间来定位发生泄漏的实际代码行。因此,不要期望该工具立即识别出肇事者。

您是否在任何时候与COM对象交互?是什么让您认为它在泄漏?将应用程序浸入水中,看看气泡从何处冒出来。@vcsjones根据您的request@MichaelTodd我只调用.NET对象。。。尽管他们可能在幕后打电话给COM。这有关系吗?您是否在任何时候与COM对象交互?是什么让您认为它在泄漏?将应用程序浸入水中,看看气泡从何处冒出来。@vcsjones根据您的request@MichaelTodd我只调用.NET对象。。。尽管他们可能在幕后打电话给COM。这有关系吗?