MVC3内存管理

时间:2012-02-23 07:28:52

标签: asp.net-mvc-3 memory-management ef-code-first

检查ASP.NET MVC3应用程序中的内存使用情况的最佳方法是什么?

我的托管服务提供商告诉我每隔一段时间就重新调用IIS应用程序池以提高网站的速度。这是什么'推荐做法'?当然,我不需要经常重启我的应用程序?我更愿意在我的应用程序中找出是否存在内存使用问题并进行更正。所以任何提示&您使用的最佳实践也非常有用。

该应用程序基于ASP.NET MVC3,C#和EF Code First。任何指导,链接赞赏。

编辑: 我发布后找到了这个页面,这非常有用。但我仍然希望听到其他任何观点。

ASP.NET MVC and EF Code First Memory Usage

谢谢

2 个答案:

答案 0 :(得分:3)

我有一个永远不会回收的网站(直到机器每周重启)

您的申请一般应保持良好状态。如果没有,那就有一些泄漏。 这可能是因为

  1. 缓存永不过期
  2. 缓存永不过期
  3. 会话存储不断增长,永不超时
  4. ObjectContexts永远不会丢弃并保存在会话等中
  5. 应处理的对象不是

  6. 通过依赖注入容器创建的对象不会在每次请求后设置为释放,因此可能会使内部集合继续增长。

  7. 还有更多原因 - 但这些是主要原因。

    所以问题确实是'没有最好的做法 - 这取决于你的应用'

    如果您在重新启动期间担心当前会话,请记住重启可以很快并且允许当前请求完成(有时)并且表单身份验证令牌将在重新启动后继续存在,但是除非您配置了会话,否则会话将不会进程状态服务器。

    如果您的内存使用量持续增长,则设置重启计划,否则每周执行一次或从不执行 - 或者设置一旦内存进入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

如果应用程序存在内存或性能问题,您可以做的其他事情至少可以做好准备:

  • 正确分层应用程序,意味着您可以重构效率较低的部分,而不会影响其他部分。
  • Repository模式将非常有用,因为您可以开始使用EF,找出EF用于大量内存(例如您找到的链接),但是您可以切换存储库实现以使用PetaPoco或者Dapper.net。
  • 一般来说,OR \ M更像是一个重型库,如果应用程序不需要ORM功能但只是快速使用数据库,请从头开始使用像上面提到的mico-Orm
  • 始终处置实现IDisposable的对象。
  • 处理大型db记录时,请使用分页。它对服务器资源的使用和用户体验都有好处
  • 尽可能地应用YAGNI(你不需要它)原则,这在某种程度上暗示了一点TDD:)