正在关注thisSOanswer,我在做:ThreadPool.QueueUserWorkItem(delegate{GC.Collect();GC.WaitForPendingFinalizers();GC.Collect();});我的目标是在关闭包含大量图像/PictureBox控件的大型WinForms窗体后运行垃圾回收,以确保内存中不再有图像。(我相信我遵循了theinstructionsofJonSkeet)。我在后台线程中执行此操作,以便尝试让我的UI响应。我的问题:在后台线程中进行垃圾回收对我有什么好处吗?还是它实际上会使我的应用程序变慢/挂起时间变长?
好的,我已经阅读了几个关于它的主题,但现在就开始吧。假设我有一个应用程序,基本上我会时不时地点击一个按钮,几分钟内会发生很多事情,然后它可能会再闲置一个小时,或者可能只是1分钟。难道不是在整个结束之后调用GC.Collect的好情况吗?我的意思是,我确实知道在那一刻我不会使用我的应用程序,而且GC无法猜测。 最佳答案 我看到有几个人对不建议调用GC.Collect变得极端。GC.Collect的存在是有原因的,这是我关于何时以及为何调用GC.Collect的建议。一般来说,不用担心调用它,GC会很好地调整自己,并会做正确的事情。有时
我使用Reflector在System.Web.ISAPIRuntime中找到了这段代码publicvoidDoGCCollect(){for(inti=10;i>0;i--){GC.Collect();}}任何人都可以对此发表评论吗?是否有理由在循环中执行GC.Collect()?为什么是10次而不是3、5或20次?分析表明它没有在.net框架内使用,但它是公开的,所以我想IIS可以调用它...编辑:仅供说明:我从未调用过GC.Collect,也无意使用它。我知道在大多数(如果不是全部)情况下这是个坏主意。问题是.net框架为什么这样做。感谢您的所有回答。
GC用于托管对象,Finalize用于非托管对象,这就是我一直在阅读的内容。Dispose是隐式的,Finalize是Explicit是我一直在阅读的内容。有人可以给我一个模块的示例吗,其中出于不同原因使用了所有这三种东西? 最佳答案 GC是垃圾回收。它是自动内存管理,负责处理托管堆上分配的对象的清理。.NETGC采用标记清除算法。当发生垃圾回收时,它基本上认为要清理的堆部分中的所有对象都是可恢复的。然后它会经历一个标记过程,在这个过程中它会扫描根。IE。它标识应用程序仍在使用的对象。完成后,剩余的对象有资格进行清理。作为清理的一部
我有以下代码:publicvoidDispose(){if(_instance!=null){_instance=null;//CallGC.SupressFinalizetotakethisobjectoffthefinalization//queueandpreventfinalizationcodeforthisobjectfrom//executingasecondtime.GC.SuppressFinalize(this);}}虽然有评论解释了那个与GC相关的调用的目的,但我仍然不明白为什么它在那里。一旦所有实例不复存在,对象是否注定要进行垃圾回收,例如在usingblock
我正在尝试使用VisualStudio来跟踪我的应用程序中的内存使用情况。在“诊断工具”窗口中,它显示我的应用程序正在使用423MB。谢谢,我转到“内存使用”和“ViewHeap”,当我单击快照时,我会得到一个显示对象大小的表格。但是当我把这些数字加起来时:=3317228+403764+354832+264984+244836+195748+144032+28840+16452+13920+13888+3428+2100+20=5004072=4.77MB我的问题是为什么这个数字4.77MB与我在“内存”图表上看到的423MB不匹配。我希望在左边的表格中看到423MB的去向。请告诉我
我开始审查项目中的一些代码并发现了类似这样的内容:GC.Collect();GC.WaitForPendingFinalizers();这些线条通常出现在旨在提高效率的理由下破坏对象的方法上。我发表了以下评论:在销毁每个对象时显式调用垃圾回收会降低性能,因为这样做没有考虑到CLR性能是否绝对必要。按此顺序调用这些指令会导致每个对象仅在其他对象正在完成时才被销毁。因此,一个可以独立销毁的对象必须在没有真正必要的情况下等待另一个对象的销毁。它会产生死锁(参见:thisquestion)1、2和3是真的吗?你能提供一些引用来支持你的答案吗?虽然我几乎可以肯定我的言论,但我需要在我的论点中说清
我今天和我的同事进行了交谈,她说她刚刚了解了使用using语句的原因。//Usingkeywordisusedtocleanupresourcesthatrequiredisposal(IDisposableinterface).using(StreamReaderreader=newStreamReader(@"C:\test.txt")){stringline=reader.ReadLine();}我指出该对象被标记为“可以被处置”但实际上并没有被处置和垃圾收集,除非GC决定这样做。她回答说,一旦using语句结束,对象将被自动释放,因为using语句被转换为try-catch-f
好的,众所周知,当GC将对象识别为垃圾时,它会隐式调用对象上的Finalize方法。但是如果我执行GC.Collect()会发生什么?finalizer是否仍然执行?有人问我这个问题,我回答"is",然后我想:“完全正确吗?” 最佳答案 Ok,it'sknownthatGCimplicitlycallsFinalizemethodsonobjectswhenitidentifiesthatobjectasgarbage.不不不。这不是已知,因为要成为知识,一个陈述必须是真。该声明是错误的。垃圾收集器在跟踪时不会运行终结器,无论它是自
我对堆栈与堆之间的内存分配基础感到困惑。根据标准定义(每个人都这么说),所有值类型都将分配到堆栈,引用类型将分配到堆。现在考虑下面的例子:classMyClass{intmyInt=0;stringmyString="Something";}classProgram{staticvoidMain(string[]args){MyClassm=newMyClass();}}现在,内存分配将如何在C#中发生?MyClass(即m)的对象会不会被完全分配到Heap?也就是说,intmyInt和stringmyString都将进入堆?或者,对象会被分成两部分,分配到Stack和Heap的两个内