我有许多ASP.NET(4.0)Web应用程序,在每个请求期间似乎泄漏(少量)内存.这是一个很小的数量,对于大多数用例来说,它不会成长为几周甚至几个月的问题.我通常会尝试关闭应用程序管理的任何连接,避免状态变量(或我的单例的实例变量)等.
我的问题是 - 这是ASP.NET应用程序的正常行为吗?我已经关闭了在闲置20分钟后回收应用程序池的默认(IIS 7)行为.我这样做是因为应用程序需要几分钟来构建其内部缓存,我希望避免对用户体验产生负面影响(让他们在发出请求时等待应用程序启动).
我知道这可以通过序列化缓存或加快缓存生成过程来缓解,但我的问题更多地与它的原理有关:我个人认为依赖IIS自动回收功能作为一种绑定方法.我错了吗?我只是没有看到垃圾收集器在工作,因为应用程序的内存使用量与可用内存量相比不够高?还是我应该深入研究记忆问题?
任何见解将不胜感激.
我正在使用Lucene.net 3.0.3.0(现在是最新版本)。我想知道在生产环境中使用IndexWriter和IndexSearcher的单个实例是否是一个不错的选择(考虑到线程安全)。我在文档中读到创建这些实例的新对象是一项昂贵的操作,并且在内部 lucene 可以很好地处理并发请求。
这是给在生产环境中使用过lucene.net的人一个疑问;请让我知道这是否可行!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lucene.Net.Search;
using Lucene.Net.Store;
using System.IO;
using Directory = Lucene.Net.Store.Directory;
using Version = Lucene.Net.Util.Version;
using Lucene.Net.Index;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Analysis;
namespace MXLuceneConsoleApp
{
/// <summary>
/// This helper class applies a singleton pattern to create Searcher and Writer objects as it's recommended to create them only once.
/// Also the searcher gets reinitialized, if any write happens.
/// </summary>
public class …Run Code Online (Sandbox Code Playgroud) Lucene文档指出,IndexSearcher和IndexWriter的单个实例应该用于整个应用程序中的每个索引,以及所有线程.此外,在重新打开索引之前,对索引的写入将不可见.
所以,我试图在多线程设置中遵循这些指南.(一些线程编写,多个用户线程搜索).我不想在每次更改时重新打开索引,而是希望保持搜索器实例不超过一定的时间(比如20秒).
中央组件负责打开索引读取器和编写器,并保留单个实例并同步线程.我跟踪上次任何用户线程访问IndexSearcher的时间,以及它变脏的时间.如果有人需要在更改过去20秒后访问它,我想关闭搜索器并重新打开它.
问题是我不确定先前对搜索者(由其他线程制作)的请求是否已经完成,因此我可以关闭IndexSearcher.这意味着如果我关闭并重新打开在所有线程之间共享的单个IndexSearcher实例,则可能会在其他某个线程中同时进行搜索.
更糟糕的是,这是理论上可能发生的事情:可以同时执行多次搜索.(假设有数千名用户在同一索引上运行搜索).单个IndexSearcher实例可能永远不会被释放,因此可以关闭它.理想情况下,我想创建另一个IndexSearcher并将新请求指向它(虽然旧的仍然打开并运行之前已请求的搜索).当旧实例上运行的搜索完成后,我想关闭它.
同步IndexSearcher(或IndexWriter)的多个用户以调用close()方法的最佳方法是什么?Lucene是否为此提供任何功能/设施,或者它应该完全由用户代码完成(比如使用搜索器计算线程,并在每次使用时增加/减少计数)?
有关于上述设计的任何建议/想法吗?