【问题标题】:Do I have a memory leak in my website? [closed]我的网站是否存在内存泄漏? [关闭]
【发布时间】:2011-09-09 17:18:42
【问题描述】:

我有一个使用 ASP.NET MVC 3 和 Entity Framework 4.1 准备的网站。下图是我服务器的性能日志。

我的问题是w3wp.exe 每分钟都在变得越来越大并且永远不会释放。我在查询中使用LINQ to Entities,并且我所有的实体框架代码都在使用块中。

我认为这是一个垃圾收集问题,但我不确定。我的问题是什么?如何解决?

【问题讨论】:

  • 如果您没有耗尽内存,这不是问题。 .NET 将分配它需要的内存,但除非必要,否则不会将其释放回系统,因为它更便宜的性能明智。除此之外,您的问题可能会被关闭,因为 1)这里有很多类似的问题,并且 2)完全不可能回答“我的问题是什么,我该如何解决?”在谈论我们从未见过的应用程序时,我们甚至不知道是否存在问题。
  • 感谢您的评论,但我确实写在这里,因为 clr 内存日志让我对几个小时后的垃圾收集感到好奇 w3wp.exe 可以获得 600MB 或更高。正如你所看到的,我认为终结幸存者并不正常,因为他们一直在变高。 GC 工作吗?从现在开始,我可以再添加一张照片。
  • 如果不提供使用 ADPlus 的进程转储结果和 WinDBG 的一些分析,这里的社区帮助范围很小。我建议你去阅读Tess Ferrandez's blog 并加快调试内存泄漏的速度。她有一个很棒的实验室系列可以让你从这里开始:blogs.msdn.com/b/tess/archive/2008/02/04/…

标签: asp.net-mvc-3 linq-to-entities entity-framework-4.1 w3wp.exe


【解决方案1】:

这完全取决于您的网站在做什么。我们有在 32 GB RAM 上运行的 .NET 服务器,并且工作进程很乐意接受它想要的一切。它真的需要它。

您是否在运行大量后台线程,在会话/全局应用程序/静态方法中存储了大量数据?

连接字符串、阅读器、文件I/O等是否正确关闭?

.NET 垃圾收集效果很好,但您必须尽自己的一份力量。垃圾收集器(废物处理工程师)不会进入你的房子为你收集它,你至少必须把它走到路边……或者关闭/清空/处理你不使用的物体。

更新 1:

正在发生的事情是 ASP.NET 工作进程正在创建缓冲区。当它达到一定的内存使用量时,它会随着时间的推移而减少,但它喜欢分配内存,因此它不必在需要时不遗余力地获取它。

【讨论】:

  • 感谢您的评论,它是一个游戏服务器的管理站点,我的服务器有 2gb 内存,我不是唯一一个使用它的人,所以我需要照顾它。我在使用块时使用实体框架,正如我在问题中所说的,我认为它可以完成关闭连接等工作。我也没有使用 IO 和多线程。当访问者访问我的网站时,内存正在增加并且从未释放这是我的问题。
  • 我尽我所能为我用来传递自身以查看的列表对象做空。因为他们正在完成 linq 查询并返回查看。我从来没有在任何地方调用过 Dispose(),因为我没有任何类拥有它。
  • 2GB 内存对于任何 Web 服务器都是不够的。哎呀,2GB 的内存对于我的工作站来说是不够的。
  • 你是对的。我需要移动另一个具有 4gb 或 8gb 东西的 vps。
  • 但首先我需要知道如何解决这个问题,我不想在其他 vps 上通过 8gb ram。
【解决方案2】:

您应该运行分析器来查看哪些进程和线程正在失控。 Visual Studio 2010 有一些不错的分析工具,我相信还有一些其他的第三方工具。

这很可能是开发人员的糟糕编码,垃圾收集可能没有像上面提到的 Ryan 那样发挥作用。特别是如果您的应用程序使用多个线程。

【讨论】:

  • 我可以在我本地的分析器中使用这个 vs2010 在 Web 服务器上的站点进行分析吗?
猜你喜欢
  • 2013-03-22
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多