我有一个 ASP.NET MVC 3 应用程序,它有一个 MS SQL Server 2008 远程数据库,通过 Fluent NHibernate 连接。我有另一个应用程序正在向触发新项目添加到数据库的 URL 发出各种 GET 请求。每次添加项目时,我本地 Web 服务器的内存都会增加大约 100k。
public ActionResult AddItem(string text)
{
using (var DatabaseSession = new FluentDatabase().Session)
using (var tx = DatabaseSession.BeginTransaction())
{
Item item = DatabaseSession
.QueryOver<Item>()
.Where(x => x.Text == text)
.SingleOrDefault();
if (item == null)
item = new ... // initialize
item.Text = text;
DatabaseSession.SaveOrUpdate(item);
tx.Commit();
DatabaseSession.Flush();
}
return RedirectToAction("Index");
}
我知道这不是向数据库添加项目的理想方式,但这只是对其他一些功能的测试。在调用此方法约 1000 次后,服务器占用了超过 1GB 的数据!不久之后,我的内存用完了,它崩溃了。这没有多大意义,因为所有项目都应该被垃圾收集。我在这里遗漏了什么吗?
最佳答案
找到问题最简单的方法是使用一些内存分析器,它们会告诉你哪些对象留在内存中以及谁持有它们:
MemProfiler,付费,http://memprofiler.com/
CLR Profiler,免费,Microsoft CLR Profiler for .Net 4 - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=be2d842b-fdce-4600-8d32-a3cf74fda5e1 , .Net 2 和 3.5 的 CLR Profiler - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0 .这是它的文档 - http://msdn.microsoft.com/en-us/library/ff650691.aspx
关于fluent-nhibernate - ASP.NET MVC 3 - WebDev 服务器使用 Fluent NHibernate 泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048047/