我有一个似乎使用大量内存的ASP.NET网站。我在星期天离开了7个小时,它达到了3.2gb。我以为.NET处理了所有它自己的垃圾收集/免费对象等等,所以我不确定从哪里开始寻找解决方案。
该网站大量使用XML,所以我认为这可能是问题,但我已经实现了XMLSerializer的全球使用,试图将其排除在外。
我还有一个自定义处理程序,可以处理所有图像,调整大小,缓存,然后从缓存中加载。这会导致任何问题吗?
很抱歉这么模糊,但问题是我不知道从哪里开始真正的问题。任何帮助表示赞赏。
服务器信息: .NET 2.0 Windows 2008服务器 IIS7
提前致谢。
答案 0 :(得分:5)
最佳起点是使用分析器。 RedGate拥有ANTS Memory Profiler,它非常好并且有免费试用版。 Product page here.
您运行应用程序,附加探查器然后正常开始使用该页面。探查器收集有关正在使用的对象的信息,这应该可以帮助您查明问题的根本原因。
在我的应用程序中,结果是我们意外地为我们执行的每个查询创建了一个NHibernate SessionFactory。这些都是由NHibernate内部引用的,这意味着它们除了非常缓慢和低效之外从未被释放。探查器引导我们正确使用它,我们永远不会发现它。
答案 1 :(得分:2)
RedGate的替代方案是使用adplus和WinDbg。另请阅读此博客:
这是调试问题的绝佳帮助来源。
我的SysAdmin和我已成功使用adplus和WinDbg在ASP.NET应用程序中查找内存泄漏。我的开发人员错误的是,他们在没有过期超时的情况下意外地使用了ASP.NET的缓存。
另一个问题是,开发人员使用了XMLSerialization的Attribute重载。使用该功能.net将 allays 创建一个新的序列化助手(无论如何)程序集。无法卸载程序集,因此应用程序会占用大量内存
答案 2 :(得分:1)
在处理文件系统时,处理读者和临时对象非常重要。
答案 3 :(得分:1)
你说你经常使用XmlSerializer。如果您没有使用默认构造函数XmlSerializer(type)和XmlSerializer(type,defaultNameSpace),则会导致内存泄漏。
有关详细信息,请参阅this MSDN article