C# Web api方法消耗大量IIS应用程序池内存

C# Web api方法消耗大量IIS应用程序池内存,c#,asp.net-mvc,iis-7,C#,Asp.net Mvc,Iis 7,很抱歉这个模糊的题目,但我不知道发生了什么,所以我现在不能说得更清楚。基本上,我注意到IIS应用程序池占用了我们运行的api的大量内存 我有一个Web api方法,可以返回客户列表 public async Task<IHttpActionResult> GetCustomerList() { List<CustomerDTO> dtoCustomers = await customerService.GetCustomers(); return Cre

很抱歉这个模糊的题目,但我不知道发生了什么,所以我现在不能说得更清楚。基本上,我注意到IIS应用程序池占用了我们运行的api的大量内存

我有一个Web api方法,可以返回客户列表

public async Task<IHttpActionResult> GetCustomerList()
{
    List<CustomerDTO> dtoCustomers = await customerService.GetCustomers();

    return CreatedAtRoute("DefaultApi", new { }, dtoCustomers);
}
public异步任务GetCustomerList()
{
List dtoCustomers=wait customerService.GetCustomers();
返回CreatedAtRoute(“DefaultApi”,new{},dtoCustomers);
}
下面是GetCustomers方法:

public async Task<List<CustomerDTO>> GetCustomers()
{
    List<CustomerDTO> lstCustomers = new List<CustomerDTO>();
    using (DBContext db = new DBContext())
    {
        var Customers = await db.Customers.Where(i => i.Deleted == false).OrderBy(i => i.CustomerName).ToListAsync();
        foreach (var Customer in Customers)
        {
            lstCustomers.Add(Mapper.Map<CustomerDTO>(Customer));
        }
    }
    return lstCustomers;
}
public异步任务GetCustomers()
{
List lstCustomers=新列表();
使用(DBContext db=new DBContext())
{
var Customers=await db.Customers.Where(i=>i.Deleted==false).OrderBy(i=>i.CustomerName.toListSync();
foreach(客户中的var客户)
{
lstCustomers.Add(Mapper.Map(Customer));
}
}
回报客户;
}
AutoMapper映射调用只是更新Customer对象的一个实例,并设置实体对象的值(仅名称和地址)

每个调用返回大约100K的数据。每次调用时,IIS工作进程都会将其内存使用量增加约50-100MB或更多。多次运行该方法会导致工作进程内存急剧增加。我做了一个测试,在这个测试中,我从GetCustomers()调用返回了一个空列表,IIS内存使用率仍然在增加,但速度要慢得多(每次调用约80K)

所以IIS工作人员一直在太快地消耗内存,我很惊讶它没有被垃圾收集。我可以对应用程序池设置一个内存限制,但它会在一天中反复循环使用


有人看到我正在做的事情中有什么特别愚蠢的东西导致了内存消耗吗?任何想法都将不胜感激。

这可能是一个非常复杂的问题,而且这个问题可能太广泛了。任何人都需要访问所有代码和配置才能真正帮助您。否则,我们只能给出建议。使用内存探查器分析哪些对象未被收集以及原因。这里到底有什么问题?您的服务器内存是否不足?与.NET关于内存的斗争可能是一场艰苦的战斗。因此,我在阅读时接受了建议:使用ANTS Profiler。有趣的是,在分析api(探查器通过端口8013对url进行管道分析)时,内存使用量是稳定的,即使有大约100次调用,大部分内存使用量都是分配给.NET的未使用内存。当我在没有分析器(没有端口8013)的情况下进行api调用时,应用程序池内存出现了如上所述的峰值。@尼克,你在我写我的评论时写了你的评论!我现在想知道这是否是一个问题,尽管应用程序池的内存使用似乎足够真实。检查内存快照中分配的对象时,它们大多与实体框架相关。另外,为了回答您的问题,服务器并没有内存不足——只是碰巧注意到各种应用程序池使用了意外的大量内存,并开始进行调查。我现在想知道这是否真的是一个问题……使用实体框架会带来很多开销。如果出现问题,您可以采取措施控制EF的缓存行为。问题已经解决,但一些注释可能有用(编译为32位)。这个问题似乎也有类似的问题;建议是关闭和处理数据库连接,测试和删除第三方库。