检查ASP.NET MVC3应用程序中的内存使用情况的最佳方法是什么?
我的托管服务提供商告诉我每隔一段时间就重新调用IIS应用程序池以提高网站的速度。这是什么'推荐做法'?当然,我不需要经常重启我的应用程序?我更愿意在我的应用程序中找出是否存在内存使用问题并进行更正。所以任何提示&您使用的最佳实践也非常有用。
该应用程序基于ASP.NET MVC3,C#和EF Code First。任何指导,链接赞赏。
编辑: 我发布后找到了这个页面,这非常有用。但我仍然希望听到其他任何观点。
ASP.NET MVC and EF Code First Memory Usage
谢谢
答案 0 :(得分:3)
我有一个永远不会回收的网站(直到机器每周重启)
您的申请一般应保持良好状态。如果没有,那就有一些泄漏。 这可能是因为
应处理的对象不是
通过依赖注入容器创建的对象不会在每次请求后设置为释放,因此可能会使内部集合继续增长。
还有更多原因 - 但这些是主要原因。
所以问题确实是'没有最好的做法 - 这取决于你的应用'
如果您在重新启动期间担心当前会话,请记住重启可以很快并且允许当前请求完成(有时)并且表单身份验证令牌将在重新启动后继续存在,但是除非您配置了会话,否则会话将不会进程状态服务器。
如果您的内存使用量持续增长,则设置重启计划,否则每周执行一次或从不执行 - 或者设置一旦内存进入XYZ然后重置。一旦达到某个阈值,ASP.NET将自动重启,具体取决于主机在memoryLimit上设置的内容: http://msdn.microsoft.com/en-us/library/7w2sway1.aspx
答案 1 :(得分:0)
默认情况下,IIS会每隔一段时间自动回收应用程序池(我认为是29小时左右),但无论您使用的内存有多少或多少,主机都可以确定这一点。回收触发器可以是时间间隔或当进程达到某个内存使用限制时。我确定任何共享主机都设置了它们。
关于内存使用情况,您可以使用GC.GetTotalMemory方法,该方法将为您提供近似用法。即使使用Perfmon,读数也不是很准确,但它会给你一个想法。
//global.asax.cs
void Application_EndRequest(object o,EventArgs a)
{
var ctype=Context.Response.Headers["Content-Type"];
if (ctype == null || !ctype.Contains("text/html")) return;
Context.Response.Write(string.format("<p>Memory usage: {0}</p>",GC.GetTotalMemory(false)));
}
请注意,在GC开始使用之前,您会看到使用量不断增加,并且使用量会下降到更逼真的状态。值。
如果您有钱我推荐使用专业工具,例如Memory profiler
如果应用程序存在内存或性能问题,您可以做的其他事情至少可以做好准备: