0

我正在创建一个程序,它将每 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
            }
        }
    }
}
4

3 回答 3

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

  2. 这是一个指定计时器间隔的地方。您稍后将覆盖它,因此这无济于事。

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

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

于 2013-05-09T16:07:16.317 回答
0

如果每秒钟对不必要地使用 1 兆字节的内存进行计费,那么担心无用的对象可能会存活很长时间而不被垃圾收集这一事实可能是有意义的。但是,在实践中,除非或直到有其他目的可以将内存分配给其他用途,否则留下不必要的分配内存将没有任何效果。一个典型的垃圾收集器可以被视为一个过程,它穿过一座建筑物,找到所有有价值的东西并将其移动到另一座建筑物,然后炸毁第一座建筑物并创建一个新的空建筑物。该操作的成本将主要取决于必须保留的东西的数量,并且在很大程度上与被销毁的垃圾数量无关。因此,除非有其他有用的东西可以记忆,如果允许大量的垃圾在被大规模销毁之前堆积起来,那么每兆字节的垃圾成本就会降到最低。由于各种原因,即使系统中只有一个程序,并且一个程序有 4 gig 的内存来运行它,通常最好在多个 gig 的垃圾积累之前执行垃圾收集周期,但除非有其他需要使用内存的事情,过于激进的垃圾收集会损害而不是提高效率。

于 2013-05-09T16:32:18.580 回答