C#定时器和内存泄漏

时间:2013-05-09 15:43:07

标签: c# memory-leaks timer

我正在创建一个程序,每隔2秒检查一次目录列表。我希望这个程序运行几个月而不会泄漏内存或需要任何人工干预。

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

  2. 我仍然不确定10K代表什么。这不是间隔。间隔为2k。


  3. 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
                }
            }
        }
    }
    

3 个答案:

答案 0 :(得分:4)

  1. 不,没有内存泄漏,这是使用垃圾收集器的语言中程序的预期行为。内存将增加,直到它最终到达垃圾收集器清理任何不需要的对象的点。

  2. 这是指定计时器间隔的地方。你以后会覆盖它,所以这一切都没有完成。

答案 1 :(得分:2)

  1. 我将假设您认为存在泄漏因为您的任务管理器内存使用正在上升(这是完全正常的)。虚拟内存管理器是懒惰的,除非需要,否则不会交换任何内容。一旦达到阈值,GC就会清理任何东西。

  2. 10000值是指定的计时器间隔(以毫秒为单位)。正如Servy指出的那样,你以后会覆盖它,所以除了可能在构建项目时摆脱警告(例如未实例化的对象)之外,你什么都不做。

答案 2 :(得分:0)

如果每隔一小时对一兆字节的内存进行不必要的计费,则可能有必要担心无用的对象可能会存活很长时间而不会被垃圾收集。然而,在实践中,不必要地分配内存将不起作用,除非或直到存在可以以其他方式存储该内存的其他目的。典型的垃圾收集器可以被视为穿过建筑物的过程,找到有价值的东西并将其移动到另一个建筑物,然后炸开第一个建筑物并创建一个新的空建筑物。该操作的成本主要取决于必须保留的东西的数量,并且在很大程度上将与被破坏的垃圾量无关。因此,除非存在其他有用的内存,否则如果允许大量垃圾在批量销毁之前堆积起来,则每兆字节垃圾的成本将最小化。由于各种原因,即使系统中只有一个程序,并且一个程序有四个内存来运行它,在多次垃圾累积之前执行垃圾收集循环通常是个好主意,但除非有其他需要使用内存的东西,过度积极的垃圾收集会损害而不是提高效率。