C#计时器和内存泄漏
我正在创建一个程序,每2秒检查一次目录列表。我希望这个程序可以运行数月而不泄漏内存或需要任何人机交互C#计时器和内存泄漏,c#,memory-leaks,timer,C#,Memory Leaks,Timer,我正在创建一个程序,每2秒检查一次目录列表。我希望这个程序可以运行数月而不泄漏内存或需要任何人机交互 下面的程序有内存泄漏 我仍然不确定10公里代表什么。这不是间歇时间。间隔为2k 不,没有内存泄漏,这是使用垃圾收集器的语言中程序的预期行为。内存将增加,直到最终达到垃圾收集器清除任何不需要的对象的点 这是一个指定计时器间隔的地方。您稍后将覆盖它,因此这将一事无成 不,没有内存泄漏,这是使用垃圾收集器的语言中程序的预期行为。内存将增加,直到最终达到垃圾收集器清除任何不需要的对象的点 这是一个指定
如果每秒钟就有一兆字节的内存被不必要地使用一次,那么担心无用的对象可能会存活一段时间而不会被垃圾收集这一事实可能是有道理的。然而,在实践中,不必要地分配内存将不会产生任何效果,除非或直到有其他目的可以将该内存用于其他目的。一个典型的垃圾收集器可以被视为一个过程,它穿过一栋建筑,找到所有有价值的东西并将其移动到另一栋建筑,然后炸毁第一栋建筑并创建一个新的空建筑。该操作的成本主要取决于必须保存的物品数量,并且在很大程度上与被销毁的垃圾数量无关。因此,除非内存中还有其他有用的东西,否则如果允许大量垃圾在被大规模销毁之前堆积起来,那么每兆字节垃圾的成本就会降到最低。出于各种原因,即使系统中只有一个程序,并且其中一个程序有四个Gig的内存来运行它,通常在多个Gig的垃圾积累之前执行垃圾收集周期是一个好主意,但除非有其他东西需要使用内存,过于激进的垃圾收集会损害而不是提高效率。如果每秒钟就有一兆字节的内存被不必要地使用,那么担心无用的对象可能会在没有垃圾收集的情况下存活很长一段时间是有道理的。然而,在实践中,不必要地分配内存将不会产生任何效果,除非或直到有其他目的可以将该内存用于其他目的。一个典型的垃圾收集器可以被视为一个过程,它穿过一栋建筑,找到所有有价值的东西并将其移动到另一栋建筑,然后炸毁第一栋建筑并创建一个新的空建筑。该操作的成本主要取决于必须保存的物品数量,并且在很大程度上与被销毁的垃圾数量无关。因此,除非内存中还有其他有用的东西,否则如果允许大量垃圾在被大规模销毁之前堆积起来,那么每兆字节垃圾的成本就会降到最低。出于各种原因,即使系统中只有一个程序,并且其中一个程序有四个Gig的内存来运行它,通常在多个Gig的垃圾积累之前执行垃圾收集周期是一个好主意,但除非有其他东西需要使用内存,过于激进的垃圾收集会损害而不是提高效率。C#如果垃圾被收集,那么内存泄漏的具体原因是什么?因此:1。内存泄漏的证据在哪里。2.什么是“做点什么”,因为泄漏几乎肯定会存在。每隔2秒左右内存使用率就会下降increasing@JohnRyann那么我相信根本没有内存泄漏;这只是垃圾收集环境的预期行为。@JohnRyann为什么不检查一下
Timer
的文档,亲自看看它是怎么说的呢?C#是垃圾收集的,你到底是如何有内存泄漏的?所以:1。内存泄漏的证据在哪里。2.什么是“做点什么”,因为泄漏几乎肯定会存在。每隔2秒左右内存使用率就会下降increasing@JohnRyann那么我相信根本没有内存泄漏;这只是垃圾收集环境的预期行为。@JohnRyann为什么不检查计时器的文档,亲自看看它说了什么?@JohnRyann您没有在任何地方“放置垃圾收集”。你从未做过任何事情来运行垃圾收集,你也不需要这样做。它会
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
}
}
}
}