我有一个用于索引目的的Windows服务多线程应用程序,它有六个线程。除内存泄漏外,它工作正常。实际上当服务启动时,服务正在消耗12,584kb内存,一段时间后内存为61,584 kb。但是在索引过程完成后,它不会释放内存。 我需要它在索引完成后回到它以前的位置,也就是它应该占用它开始的内存,例如在这种情况下为12,584kb。 我已经使用了垃圾收集,但它没有做我想要的。
有人可以帮助我吗?
答案 0 :(得分:4)
首先建议是在它上面放一个内存分析器。我一直对Red Gate's ANTS profiler感到满意,这有助于识别哪些对象泄漏(如果有的话)。
请记住,可能有第一次初始化发生在所有地方,所以你可能想要随着时间的推移跟踪它
答案 1 :(得分:2)
.NET不会释放内存以满足人们盯着任务管理器的需求。分配内存很昂贵。 CLR的设计非常谨慎,并尽可能长时间地保留它所分配的任何内存。可以这样想吧 - 当你不使用它的一半时,有4GB的内存是什么意思?
除非您确实知道您有内存泄漏(例如,您的应用程序在正常运行两天后崩溃),让我给您一些建议......关闭任务管理器。在您知道需要之前不要优化内存。放松,伙计。一切都很好。
答案 2 :(得分:1)
61 MB与众不同。您需要让服务运行一段时间并监视其内存使用情况以获得上升趋势。如果您看到应用程序在某个值上达到平衡,则可能无需担心。
答案 3 :(得分:0)
我完全赞同威尔 - 但是我提供了2条小建议:
答案 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分析器......)