C#定时器和内存泄漏(C# Timer and memory leak)

2019-09-02 10:09发布

我创建一个程序,将检查目录每2秒上市。 我希望这个程序没有内存泄漏,或任何需要人机交互几个月运行。

  1. 下面程序有内存泄漏。

  2. 我仍然不知道什么是10K代表。 这不是间隔。 的间隔为2k。


class Program
{
    static void Main(string[] args)
    {
        Timer aTimer = new Timer(10000);
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
        Console.WriteLine("Press the Enter key to exit the program.");
        Console.ReadLine();
        GC.KeepAlive(aTimer);
    }

    private static void OnTimedEvent(object source, ElapsedEventArgs e )
    {
        Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);

        string[] DirList = Directory.GetFiles(@"C:\TTImer");
        if (DirList.Length > 0)
        {
            foreach (string s in DirList)
            {
                //do something
            }
        }
    }
}

Answer 1:

  1. 没有,没有内存泄漏,这是一个程序在使用垃圾收集器的langauge预期的行为。 该内存将增加,直到最终它击中一个地步,垃圾收集清理所有不需要的对象。

  2. 这是指定计时器的时间间隔的地方。 你以后覆盖它,所以这是完成什么。



Answer 2:

  1. 我会假设你相信有泄漏 ,因为你的任务管理器内存使用正在上升(这是完全正常的)。 虚拟内存管理器是懒惰的,除非它需要不会换出任何东西。 一旦阈值被击中你的GC将清理东西。

  2. 的10000值以毫秒为单位指定的定时器间隔。 作为Servy指出的那样,你以后覆盖它,所以你要完成什么,除了在建项目也许摆脱警告(例如未初始化的对象)。



Answer 3:

如果一个人被标榜为每秒该内存兆字节正在不必要使用,那么它可能是有意义担心的事实是没用的对象可能很长一段时间生存,没有被当作垃圾回收。 但在实践中,留下不必要分配的内存不会有任何影响,除非或直到有哪个内存本来可以放一些其他目的。 典型的垃圾收集器可以被视为作为通过建筑物去的方法,发现的值一切并将其移动到另一个建筑物,然后炸药第一建筑物,并创建一个新的空的。 该操作的成本将主要取决于所必须保持的东西量,将在很大程度上独立于被破坏了的垃圾量。 因此,除非有别的东西有用,可以存储,垃圾每兆字节的成本将大量的,如果垃圾被允许堆放之前它被摧毁批发最小化。 由于种种原因,即使在系统中只有一个项目,一个有运行内存的四项演出,它一般会是一个好主意执行垃圾收集循环垃圾的多个演出积累了之前,但除非有需要使用记忆其他东西,过于激进的垃圾收集会削弱而不是提高效率。



文章来源: C# Timer and memory leak