Tag: 垃圾收集

是否可以停止.NET垃圾回收?

程序员可以用C#编程语言以编程方式启动/停止垃圾收集吗? 例如,用于性能优化等。

MVVM light Messenger中的操作,局部变量和垃圾收集的奇怪行为

我对MVVM Light中的Messenger系统有一个非常奇怪的问题。 这很难解释,所以这里有一个小程序来演示这个问题: using System; using GalaSoft.MvvmLight.Messaging; namespace TestApp { class Program { static void Main(string[] args) { var prog = new Program(); var recipient = new object(); prog.RegisterMessageA(recipient); prog.RegisterMessageB(recipient); prog.SendMessage(“First Message”); GC.Collect(); prog.SendMessage(“Second Message”); } public void RegisterMessageA(object target) { Messenger.Default.Register(this, (Message msg) => { Console.WriteLine(msg.Name + ” recieved by A”); var x = […]

将.Net Garbage收集一个未被引用的对象,但是有一个正在运行的线程吗?

我有以下代码(为了便于阅读而减少): 主类: public StartProcess() { Thinker th = new Thinker(); th.DoneThinking += new Thinker.ProcessingFinished(ThinkerFinished); th.StartThinking(); } void ThinkerFinished() { Console.WriteLine(“Thinker finished”); } 思想家class级: public class Thinker { private System.Timers.Timer t; public delegate void ProcessingFinished(); public event ProcessingFinished DoneThinking; BackgroundWorker backgroundThread; public Thinker() { } public StartThinking() { t = new System.Timers.Timer(5000); // 5 second timer […]

包含实现IDisposable的项的会话

在ASP.NET中,如果项目保留在实现IDisposable的会话状态,但是当会话到期时,应用程序永远不会被应用程序专门删除和处理,那么将在对象上调用Dispose()将执行Dipose()中的任何代码吗?

垃圾收集应该已经删除了对象,但WeakReference.IsAlive仍然返回true

我有一个测试,我希望通过,但垃圾收集器的行为不是我所假设的: [Test] public void WeakReferenceTest2() { var obj = new object(); var wRef = new WeakReference(obj); wRef.IsAlive.Should().BeTrue(); //passes GC.Collect(); wRef.IsAlive.Should().BeTrue(); //passes obj = null; GC.Collect(); wRef.IsAlive.Should().BeFalse(); //fails } 在这个例子中, obj对象应该是GC’d,因此我希望WeakReference.IsAlive属性返回false 。 似乎因为obj变量声明在与GC.Collect相同的范围内,所以它没有被收集。 如果我在方法之外移动obj声明和初始化,则测试通过。 有没有人对此行为有任何技术参考文档或解释?

如何在C#中的Dispose()方法中配置托管资源?

我知道Dispose()是针对非托管资源的,当不再需要资源时,应该在不等待垃圾收集器完成对象的情况下处理资源。 但是,在处理对象时,它会抑制垃圾收集器的完成(GC.SuppressFinalize(this);在下面的代码中)。 这意味着如果对象包含托管资源,我们也必须处理它,因为垃圾收集器不会清理它。 在下面的示例代码中(来自MSDN),“Component”是一个托管资源,我们为此资源调用dispose()(component.Dispose())。 我的问题是,我们如何为作为托管资源的Component类实现此方法? 我们应该使用像Collect()这样的东西来捅垃圾收集器来清理这部分吗? 任何想法将不胜感激。 谢谢。 以下是我正在查看的代码来自MSDN: using System; using System.ComponentModel; // The following example demonstrates how to create // a resource class that implements the IDisposable interface // and the IDisposable.Dispose method. public class DisposeExample { // A base class that implements IDisposable. // By implementing IDisposable, you are announcing that // […]

是.net系统范围内的垃圾收集器还是应用程序范围内的垃圾收集器?

在与我的同事讨论期间,我怀疑.net中的垃圾收集器是在系统范围内还是在应用程序范围内工作。 意味着每个具有自己的GC的应用程序是否会影响系统性能? 我对此有点困惑。

在运行时查找对象的引用

我有一个永生的物体。 我删除了所有可以看到的引用,使用它之后,但仍然没有收集。 它的生命周期非常复杂,所以我不能确定所有引用都已被清除。 if ( container.Controls.Count > 0 ) { var controls = new Control[ container.Controls.Count ]; container.Controls.CopyTo( controls, 0 ); foreach ( var control in controls ) { container.Controls.Remove( control ); control.Dispose(); } controls = null; } GC.Collect(); GC.Collect(1); GC.Collect(2); GC.Collect(3); 我怎样才能找到它仍然有哪些参考? 为什么不收集?

C#中大型列表如何使用可用内存?

我有一个名为Population的列表,是很多位置的很好的列表,在某些时候我停止使用它。 我如何释放资源? 那么这是代码的一部分: private List Population=new List (); Population.SomeMethod(); Population.Clear(); 我使用了Clear方法,但没有用。 任何的想法?

.NET可用内存使用(如何防止OS的内存/释放内存)

我目前正在开发一个大量使用缓存数据的网站,以避免往返。 在启动时,我们得到一个“大”图形(数百个不同类型的对象的thouthands)。 这些对象通过WCF检索并反序列化(我们使用协议缓冲区进行序列化)我正在使用redgate的内存分析器来调试内存问题(在我们完成之后,内存似乎与我们应该需要多少内存无关)初始化并以此报告结束 现在我们可以从这份报告中得到的结论是: 1)分配的大部分内存是免费的(它可能在反序列化期间被正确分配,但现在它是免费的,我希望它能够返回到操作系统) 2)内存碎片化(这很糟糕,因为每当我刷新现金时我需要重做内存饥饿的反序列化过程,这反过来会创建大型对象,由于碎片而可能抛出OutOfMemoryException) 3)我不知道为什么空间是碎片的,因为当我看到大对象堆时,只有30个实例,15个object []直接连接到GC并且与我完全无关,1也是char数组直接附加到GC堆,其余15个是我的,但不是原因,因为我得到相同的报告,如果我在代码中评论它们。 所以我的问题是,我该怎么做才能更进一步呢? 我不太确定在调试/工具中要找什么,因为看起来我的内存是碎片化的,但不是我,并且.net分配了大量的可用空间,我无法释放。 另外请确保你在回答之前理解这个问题,我不是在寻找一种方法来释放.net(GC.Collect)中的内存,而是释放已经在.net中释放的内存,以及系统以及对记忆进行碎片整理。 请注意,缓慢的解决方案很好,如果可以手动对大堆进行碎片整理,那么我可以在RefreshCache的末尾调用它,如果运行需要1或2秒,则可以。 谢谢你的帮助! 我忘记了一些注意事项:1)该项目是.net 2.0网站,我在.net 4池中运行相同的结果,如果我在.net 4池中运行它并将其转换为.net 4和重新编译。 2)这些是发布版本的结果,因此调试版本不是问题。 3)这可能非常重要,我在webdev服务器上根本没有得到这些问题,只在IIS中,在webdev中我的内存消耗量与我的实际消耗量相当接近(更多,但不是5-10倍! )