c#windows服务多线程应用程序中的内存泄漏

时间:2009-08-26 13:24:29

标签: c# windows multithreading service

我有一个用于索引目的的Windows服务多线程应用程序,它有六个线程。除内存泄漏外,它工作正常。实际上当服务启动时,服务正在消耗12,584kb内存,一段时间后内存为61,584 kb。但是在索引过程完成后,它不会释放内存。 我需要它在索引完成后回到它以前的位置,也就是它应该占用它开始的内存,例如在这种情况下为12,584kb。 我已经使用了垃圾收集,但它没有做我想要的。

有人可以帮助我吗?

6 个答案:

答案 0 :(得分:4)

首先建议是在它上面放一个内存分析器。我一直对Red Gate's ANTS profiler感到满意,这有助于识别哪些对象泄漏(如果有的话)。

请记住,可能有第一次初始化发生在所有地方,所以你可能想要随着时间的推移跟踪它

答案 1 :(得分:2)

.NET不会释放内存以满足人们盯着任务管理器的需求。分配内存很昂贵。 CLR的设计非常谨慎,并尽可能长时间地保留它所分配的任何内存。可以这样想吧 - 当你不使用它的一半时,有4GB的内存是什么意思?

除非您确实知道您有内存泄漏(例如,您的应用程序在正常运行两天后崩溃),让我给您一些建议......关闭任务管理器。在您知道需要之前不要优化内存。放松,伙计。一切都很好。

答案 2 :(得分:1)

61 MB与众不同。您需要让服务运行一段时间并监视其内存使用情况以获得上升趋势。如果您看到应用程序在某个值上达到平衡,则可能无需担心。

答案 3 :(得分:0)

我完全赞同威尔 - 但是我提供了2条小建议:

  1. 请勿使用GC.Collect。相信我,你不会通过这样做来改进CLR的垃圾收集算法。事实上,准备收集但不能出于某种原因的物品将被移至第2层,在收集之前它们将不得不等待更长时间(从而可能使任何泄漏变得更糟!)
  2. 检查代码中的每个地方是否已创建某种类型的流(通常是MemoryStream)并验证流是否正确关闭(最好是在“finally”块中)

答案 4 :(得分:0)

这里我使用“log4net-1.2.10”来处理异常,使用“Lucene.net-2.1.0.3”进行索引,这里有一个“IndexWriter”类用于在索引中添加文档或从索引中删除文档。 锁(对象) {
    indexWriter.AddDocument(document); //“IndexWriter”类的indexWriter对象。
}。 我们还使用微软消息队列来检索消息。

答案 5 :(得分:0)

在我将应用程序从STA更改为MTA之前,我遇到了同样的问题:

[MTAThread] public static void Main()

而不是 [STAThread] public static void Main()

(我使用过Red Gate的ANTS分析器......)