ASP.NET中的静态对象是浪费内存吗?

6
我只是在想这个问题。我不确定ASPX如何管理垃圾处理,但据我所知,“完成加载”不会删除静态内存值或页面重新加载后。至少在C语言中,“静态”意味着内存分配将一直跟随程序,直到程序本身关闭。ASPX是否也是这样?如果我有一个静态值并从页面A转到页面B,那么该静态值是否仍然存在于RAM中,直到他们离开应用程序或者我不再在页面A上时,该值是否被删除(去到另一个网站,从服务器的应用程序池中删除它们的实例)。
根据我的经验:
  public static class foo
  {
      public static int x;
  }

  protected void Page_Load(object sender, EventArgs e)
  {
      foo.x++; //This will continue to increment from the last value before reload
  }

https://dev59.com/oUrSa4cB1Zd3GeqPU0A3 - Robert Harvey
https://dev59.com/jXI_5IYBdhLWcg3wBuNs - Robert Harvey
https://dev59.com/_G865IYBdhLWcg3wcOHG - Robert Harvey
2个回答

5

在ASP.NET中应避免使用静态类。它们会一直保留在内存中,直到应用程序重新启动,并且容易受到许多并发错误和竞争条件的影响。

即使关闭了用户会话(浏览器会话),也不会重新启动应用程序!即使用户离开并回来,它们仍会保留在内存中。因此,请务必避免使用静态类!


你有关于这个主题更深入的文章或参考资料吗?我很有兴趣了解更多。 - David East
看一下你在问题评论中可以找到的链接。你也可以在这里查看 http://bytes.com/topic/c-sharp/answers/878381-static-variable-hell-asp-net 和 http://www.foliotek.com/devblog/avoid-static-variables-in-asp-net/ StackOverFlow 上也有很多相关的帖子。 - Jason De Oliveira
2
请注意,有时候如果您确实需要在整个应用程序之间共享信息,则可能需要使用静态变量。但在这种情况下,我宁愿使用单例模式。 - Jason De Oliveira
有没有一种方法可以告诉ASP.NET终止与该会话相关的任何静态内存分配? - Serguei Fedorov
你唯一能做的就是将变量设置为null。但这会使用垃圾回收器来释放所有会话的内存,而不仅仅是一个会话。如果是静态变量,你应该明白所有会话都使用同一个对象。 - Jason De Oliveira

0

这是您的标准CLR执行模型,对于asp.net来说并没有什么不同。静态对象被视为应用程序的根,不会被垃圾回收。

这是一篇关于.NET垃圾回收工作原理的旧文章,但我认为所有原则仍然相同:http://msdn.microsoft.com/en-us/magazine/bb985010.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接