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 メガバイトのメモリが不必要に使用されていることに対して毎秒請求されている場合、不要なオブジェクトがガベージ コレクションされずにかなりの期間存続する可能性があるという事実を心配することは理にかなっています。ただし、実際には、メモリを不必要に割り当てたままにしても、そのメモリを別の目的に使用できる場合を除き、効果はありません。典型的なガベージ コレクターは、建物を通過し、価値のあるものをすべて見つけて別の建物に移動し、最初の建物をダイナマイトして新しい空の建物を作成するプロセスと見なすことができます。その操作のコストは、主に保持する必要があるものの量に依存し、破棄されるがらくたの量とはほとんど関係ありません。したがって、他に何か有用なメモリが存在しない限り、ジャンクが大規模に破壊される前に大量のジャンクが積み重なれば、ジャンクのメガバイトあたりのコストは最小限に抑えられます。さまざまな理由から、システムにプログラムが 1 つしかなく、それを実行するために 1 つのプログラムが 4 ギガのメモリを持っていたとしても、一般的には、ジャンクが数ギガ蓄積される前にガベージ コレクション サイクルを実行することをお勧めします。メモリを使用する必要がある他のもの、過度にアグレッシブなガベージ コレクションは、効率を向上させるどころか、損なうことになります。

于 2013-05-09T16:32:18.580 に答える