对于模糊的主题标题感到抱歉,但我不知道发生了什么,所以我现在不能更清楚了。基本上,我注意到IIS应用程序池为我们运行的api占用了大量内存。
我有一个Web api方法,它返回一个客户列表。
public async Task<IHttpActionResult> GetCustomerList()
{
List<CustomerDTO> dtoCustomers = await customerService.GetCustomers();
return 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;
}
AutoMapper映射只调用Customer对象的实例,并从实体对象中设置值(只是名称和地址)。
每次调用都会返回大约100K的数据。在每次调用时,IIS工作进程将其内存使用量增加约50-100MB或更多。多次运行该方法会导致工作进程内存暴涨。我做了一个测试,我从GetCustomers()调用返回一个空列表,IIS内存使用率仍然保持上升但速度慢得多(每次调用约80K)。
所以IIS工作人员只是过快地吃内存,我很惊讶它不是垃圾收集。我可以在应用程序池中设置内存限制,但它会在一整天内一遍又一遍地重复使用。
有没有人看到任何特别愚蠢的东西,我正在做的导致这种内存消耗?任何想法都将不胜感激。