Tag: 垃圾收集

什么时候需要处理?

如果您有以下代码: Bitmap bmp = new Bitmap ( 100, 100 ); Graphics g = Graphics.FromImage ( bmp ); Pen p = new Pen ( Color.FromArgb ( 128, Color.Blue ), 1 ); Brush b = new SolidBrush ( Color.FromArgb ( 128, Color.Blue ) ); g.FillEllipse ( b, 0, 0, 99, 99 ); g.FillRegion ( b, pictureBox1.Region ); […]

C#WPF中的内存泄漏

我可以使用一些建议来跟踪C#中内存泄漏的原因。 我理解什么是内存泄漏,我知道它们出现在C#中的原因,但我想知道你过去用什么工具/策略来解决它们? 我正在使用.NET Memory Profiler,我发现我关闭它管理的窗口后,我的一个巨大的主要对象是留在内存中,但我不知道如何处理严重的所有链接。 如果我不够清楚只是发一个问题的答案,我会编辑我的问题作为回应。 谢谢!

当我们没有析构函数时,为什么要调用SuppressFinalize

我有几个问题,我无法得到正确的答案。 1)当我们没有析构函数时,为什么我们应该在Dispose函数中调用SuppressFinalize。 2)Dispose和finalize用于在对象被垃圾收集之前释放资源。 无论是托管资源还是非托管资源我们都需要释放它,那么为什么我们需要在dispose函数中使用一个条件,当我们从IDisposable调用这个重写函数时传递’true’:从finalize调用时Dispose并传递false。 请参阅我从网上复制的以下代码。 class Test : IDisposable { private bool isDisposed = false; ~Test() { Dispose(false); } protected void Dispose(bool disposing) { if (disposing) { // Code to dispose the managed resources of the class } // Code to dispose the un-managed resources of the class isDisposed = true; } public void Dispose() […]

我们应该使用“工作站”垃圾收集还是“服务器”垃圾收集?

我有一个在多核4路服务器上运行的大型multithreadingC#应用程序。 目前我们正在使用“服务器模式”垃圾收集。 但是测试表明工作站模式GC更快。 MSDN说 : 使用服务器API的托管代码应用程序通过使用服务器优化的垃圾收集器(GC)而不是默认的工作站GC获得了显着的好处。 Workstation是默认的GC模式,也是单处理器计算机上唯一可用的模式。 Workstation GC托管在控制台和Windows窗体应用程序中。 它与正在运行的程序同时执行完整(第2代)集合,从而最大限度地减少延迟。 此模式对于客户端应用程序非常有用,其中感知性能通常比原始吞吐量更重要。 服务器GC仅在多处理器计算机上可用。 它为每个处理器创建一个单独的托管堆和线程,并且并行执行集合。 在收集期间,所有托管线程都会暂停(运行本机代码的线程仅在本机调用返回时暂停)。 通过这种方式,服务器GC模式可以最大化吞吐量(每秒请求数),并随着处理器数量的增加提高性能。 性能尤其适用于具有四个或更多处理器的计算机。 但我们没有看到表现闪耀!!!! 有没有人有任何建议?

定时器,事件和垃圾收集:我错过了什么?

请考虑以下代码: class TestTimerGC : Form { public TestTimerGC() { Button btnGC = new Button(); btnGC.Text = “GC”; btnGC.Click += (sender, e) => GC.Collect(); this.Controls.Add(btnGC); System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer(); tmr.Interval = 1000; tmr.Tick += (sender, e) => this.Text = DateTime.Now.ToString(); tmr.Start(); } } 如果我没有弄错,在tmr变量超出范围之后, Timer不会在任何地方被引用,因此它应该有资格进行垃圾回收。 但是当我点击GC按钮时,计时器继续运行,所以我猜它没有被收集…… 有没有人对此有解释? PS:当然,这不是一个真正的程序,我只是想向别人certificate一点…但我的证据不起作用;)

即使在需要时也不会发生垃圾收集

我制作了一个64位WPF测试应用程序。 随着我的应用程序运行并打开任务管理器,我会查看系统内存使用情况。 我看到我使用2GB,我有6GB可用。 在我的应用程序中,我单击“添加”按钮将新的1GB字节数组添加到列表中。 我看到我的系统内存使用量增加了1GB。 我点击添加总共6次,填充我开始时可用的6GB内存。 我单击“删除”按钮6次以从列表中删除每个数组。 删除的字节数组不应该由我的控件中的任何其他对象引用。 当我删除时,我没有看到我的记忆下降。 但这对我来说没关系,因为我知道GC是非确定性的,所有这一切。 我认为GC会根据需要收集。 所以现在内存看起来很满,但期望GC在需要时收集,我再次添加。 我的电脑开始滑入和滑出磁盘晃动昏迷。 为什么GC不收集? 如果那不是时候做,那么什么时候? 作为一个完整性检查,我有一个强制GC的按钮。 当我推动它时,我很快就恢复了6GB。 这不能certificate我的6个arrays没有被引用,如果GC知道/想要收集COULD吗? 我已经阅读了很多说我不应该调用GC.Collect()但是如果GC在这种情况下不收集,我还能做什么? private ObservableCollection memoryChunks = new ObservableCollection(); public ObservableCollection MemoryChunks { get { return this.memoryChunks; } } private void AddButton_Click(object sender, RoutedEventArgs e) { // Create a 1 gig chunk of memory and add it to the […]

定时器可以自动收集垃圾吗?

当你使用一个Timer或一个只运行整个程序生命周期的Thread ,你是否需要保留对它们的引用以防止它们被垃圾收集? 请不要理会下面的程序可以将timer作为类中的静态变量,这只是一个展示问题的玩具示例。 public class Program { static void Main(string[] args) { CreateTimer(); Console.ReadLine(); } private static void CreateTimer() { var program = new Program(); var timer = new Timer(); timer.Elapsed += program.TimerElapsed; timer.Interval = 30000; timer.AutoReset = false; timer.Enabled = true; } private void TimerElapsed(object sender, ElapsedEventArgs e) { var timerCast = (Timer)sender; Console.WriteLine(“Timer […]

使用匿名委托进行事件处理时的垃圾收集

UPDATE 我已将这里的各种答案结合到一个新问题的“确定”答案中。 原始问题 在我的代码中,我有一个事件发布者,它在应用程序的整个生命周期中都存在(这里简化为基本要素): public class Publisher { //ValueEventArgs inherits from EventArgs public event EventHandler<ValueEventArgs> EnabledChanged; } 因为这个发布者可以在所有地方使用,所以我非常满意自己创建这个小助手类以避免在所有订阅者中重写处理代码: public static class Linker { public static void Link(Publisher publisher, Control subscriber) { publisher.EnabledChanged += (s, e) => subscriber.Enabled = e.Value; } //(Non-lambda version, if you’re not comfortable with lambdas) public static void Link(Publisher publisher, Control subscriber) […]