Tag: memory leaks

检测“泄露”的IDisposable对象

有很多问题要求如何检测IDisposable对象泄漏。 似乎答案是“你不能” 。 我只是检查了最简单的测试用例,FxCop 10.0没有这样做,带有MSVS2010的ReSharper 4没有这样做。 这对我来说似乎不对,比C中的内存泄漏更糟糕(至少我们已经建立了检测工具)。 我在想:是否有可能使用reflection和其他模糊的高级技术,我可以在运行时注入一个检查,在终结器中查看是否已调用Dispose ? WinDBG + SOS的魔术技巧怎么样? 即使没有现成的工具,我也想知道这在理论上是否可行(我的C#不是很尖锐)。 想法? 注意这个问题的标题可能会产生误导。 这里真正的问题应该是IDisposable对象是否已正确使用Disposed() 。 由于我认为这是一个错误,因此由GC处理并不重要。 编辑 :解决方案:.NET Memory Profiler完成工作。 我们只需要在程序结束时垃圾邮件几个GC.Collect() ,以使我们的探查器能够正确地获取统计数据。

为什么要调用Dispose()? 内存泄漏不会发生?

编辑 :我的问题是没有得到我正在寻找的主要答案。 我不清楚。 我真的想知道两件事: 不能调用Dispose()导致内存泄漏? 如果你有一个大型程序并且从不在任何IDisposable对象上调用Dispose(),那么最糟糕的事情是什么? 我的印象是,如果没有在IDisposable对象上调用Dispose()可能会发生内存泄漏。 根据这个post的讨论,我的看法不正确; 如果未调用Dispose()则不会发生内存泄漏。 为什么要打扰调用Dispose()呢? 是否只是立即释放资源,而不是以后的某个时间? 如果你有一个大型程序并且从不在任何IDisposable对象上调用Dispose() ,那么最糟糕的事情是什么?

HttpClient爬网导致内存泄漏

我正在进行WebCrawler 实现,但在ASP.NET Web API的HttpClient中遇到了奇怪的内存泄漏。 所以减少版本在这里: [更新2] 我发现了问题,并没有HttpClient泄漏。 看到我的回答。 [更新1] 我添加了dispose没有效果: static void Main(string[] args) { int waiting = 0; const int MaxWaiting = 100; var httpClient = new HttpClient(); foreach (var link in File.ReadAllLines(“links.txt”)) { while (waiting>=MaxWaiting) { Thread.Sleep(1000); Console.WriteLine(“Waiting …”); } httpClient.GetAsync(link) .ContinueWith(t => { try { var httpResponseMessage = t.Result; if (httpResponseMessage.IsSuccessStatusCode) httpResponseMessage.Content.LoadIntoBufferAsync() […]

内存溢出:拥有越来越多的Microsoft.CSharp.RuntimeBinder.Semantics

我们正在寻找应用程序中的一些内存泄漏,在进行一些操作(在我们的应用程序中加载和关闭一个项目)时,我们知道内存总是增加一点点。 我们已经找到了很多它们,但是现在,10个以上增加最多的类是(根据我们的工具,ANTS Memory Profiler 8.2): Microsoft.CSharp.RuntimeBinder.Semantics.SYMTBL +键 Microsoft.CSharp.RuntimeBinder.Semantics.LocalVariableSymbol Microsoft.CSharp.RuntimeBinder.Semantics.CONSTVAL Microsoft.CSharp.RuntimeBinder.Semantics.EXPRCONSTANT Microsoft.CSharp.RuntimeBinder.Semantics.EXPRCLASS Microsoft.CSharp.RuntimeBinder.Semantics.EXPRTYPEOF Microsoft.CSharp.RuntimeBinder.Semantics.EXPRLIST Microsoft.CSharp.RuntimeBinder.Semantics.MethWithInst Microsoft.CSharp.RuntimeBinder.Semantics.CMemberLookupResults Microsoft.CSharp.RuntimeBinder.Semantics.EXPRMEMGRP Microsoft.CSharp.RuntimeBinder.Semantics.EXPRCALL Microsoft.CSharp.RuntimeBinder.Semantics.EXPRWRAP Microsoft.CSharp.RuntimeBinder.Semantics.AggregateDeclaration Microsoft.CSharp.RuntimeBinder.Semantics.Scope 不幸的是,我不是这个,所以我有点难以找到我应该释放的内容。 我检查了实例树,但是它一直都是微软的东西。 问题在于,当我们对项目进行“打开/关闭”时,我们会经历很多(大部分)代码。 编辑我们的应用程序的一部分使用dynamic关键字作为某些资源,它可能是链接的。 这里的课程不是Disposable,我应该和他们做些什么吗? 编辑2 我很确定这与我的dynamic相关,似乎C#在使用动态时创建了一个缓存。 但目前我不知道为什么它会增长(我一直加载相同的类,我将始终拥有完全相同的签名),也不知道如何清除它。

当.NET不在垃圾收集(GC)中时,如何捕获.NET进程的进程内存转储

当捕获转储文件并对其进行分析时(例如在WinDbg中),我经常会收到警告:数据可能不准确,或者命令可能无法访问,因为当收集转储文件时,进程位于GC的中间。 在进行内存分析时,我们经常这样做,因为进程中的内存很高而内存压力很高,我猜这会强制.NET到GC。 如何在GC期间避免转储? 有没有办法知道何时可以安全地捕获转储文件?

内存未在WPF映像中发布

我在Canvas加载和卸载图像。 我使用下面的代码加载Image 。 在加载我的Image之前,内存消耗为14.8MB。 Canvas c = new Canvas(); Image im = new Image(); ImageSource src = new BitmapImage(new Uri(@”E:Capture.png”)); im.Source = src; im.Height = 800; im.Width = 800; c.Children.Add(im); homegrid.Children.Add(c); //homegrid is my grid’s name Image显示正确,内存消耗现在为20.8MB。 然后我通过以下代码卸载了Image : foreach (UIElement element in homegrid.Children) { if (element is Canvas) { Canvas page = element as […]

C#WPF BitmapSource内存泄漏?

我正在开发一个BlackJack程序,它显示了BlackJack表,卡片等。计划是它将通过自动化策略一个接一个地玩数千手牌。 我有一个PlayerSeat UserControl,它包含一个绑定到ObservableCollection的ItemsControl。 这个CardInHand类包含一个名为CardImage的BitmapSource。 当实例被装箱时,它使用以下代码从资源加载卡片图像: [System.Runtime.InteropServices.DllImport(“gdi32.dll”)] public static extern bool DeleteObject(IntPtr hObject); private BitmapSource GenerateCardImage() { Stream TempStream = this.GetType().Assembly.GetManifestResourceStream(“BlackJack.Resources.CardImages.Card_” + m_Card.ShortTitle + “.gif”); System.Drawing.Bitmap sourceBMP = new System.Drawing.Bitmap(TempStream); BitmapSource tempBitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( sourceBMP.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(sourceBMP.Width, sourceBMP.Height) ); TempStream.Dispose(); DeleteObject(sourceBMP.GetHbitmap()); return tempBitmapSource; } 问题是,在我运行~500轮(~4000手或~10000卡)后,我最终得到了GDI +错误,应用程序占用了大约400MB的RAM。 这种情况迅速增长,并且与已经玩过的牌数有关。 DeleteObject()是我在另一个站点上发现的,它说这是从Bitmap释放资源的最佳方式。 它可能会产生一些小影响,但不是我正在寻找的东西。 我也尝试过Dispose()。 另一个网站说它与ItemsSource绑定有关。 我删除了绑定,内存仍然增长。 反过来,我离开了绑定并删除了生成位图的代码。 它打了4万发子弹并且没有大幅度增长(在运行的40分钟内可能+ 20MB)。 […]

当你完成所有错误时,追踪内存泄漏的策略

唉,我的程序在某个地方有内存泄漏,但如果我知道它是什么,我会被诅咒。 它的工作是读取一堆~2MB的文件,进行一些解析和字符串替换,然后以各种格式输出它们。 当然,这意味着很多字符串,因此进行内存跟踪表明我有很多字符串,这正是我所期望的。 程序的结构是一系列类(每个都在他们自己的线程中,因为我是一个白痴 ),它们作用于代表内存中每个文件的对象。 (每个对象都有一个输入队列,两端都使用锁。虽然这意味着我可以并行运行这个简单的处理,但这也意味着我有多个2MB对象坐在内存中。)每个对象的结构都是由一个模式对象定义的。 。 我的处理类在完成处理时引发事件,并传递对包含所有字符串的大对象的引用,以将其添加到下一个处理对象的队列中。 使用函数调用替换事件以添加到队列不会阻止泄漏。 其中一种输出格式要求我使用非托管对象。 在类上实现Dispose()不会阻止泄漏。 我已使用索引名称替换了对架构对象的所有引用。 没有骰子。 我不知道是什么导致它,不知道在哪里看。 内存跟踪没有帮助,因为我看到的是一堆正在创建的字符串,我没有看到引用在内存中的位置。 在这一点上,我们几乎要放弃并回滚,但我有一个病态的需要,确切地知道我是如何弄乱它的。 我知道Stack Overflow无法完全梳理我的代码,但是您可以建议哪些策略来跟踪此泄漏? 我可能会在自己的时间里这样做,所以任何方法都是可行的。

C#显式删除事件处理程序

我想知道将对象设置为null是否会清除附加到对象事件的任何事件处理程序… 例如 Button button = new Button(); button.Click += new EventHandler(Button_Click); button = null; button = new Button(); button.Click += new EventHandler(Button_Click); button = null; 等等… 这会导致内存泄漏吗?

Windows窗体应用程序中的内存泄漏

我们正在开发一个大的.NET Windows Forms应用程序。 尽管我们正在处理表单,但我们正面临内存泄漏/使用问题。 场景如下: 我们的应用程序使用60 KB的内存,并在网格中显示记录列表。 当用户点击记录时,它会打开一个表单myform.showDialog ,显示详细信息。 内存从60 KB 跳到 105 MB 。 现在我们关闭表单myform以返回到网格,并处理该表单并将其设置为null 。 内存保持在105 MB 。 现在,如果我们再次执行第2步,它将从105 MB跳到150 MB ,依此类推。 当我们关闭myForm时,我们怎样才能释放内存? 我们已经尝试过GC.Collect()等,但没有任何结果。