debug = true在web.config =坏事情?

我们看到很多虚拟内存碎片和内存不足错误,然后达到3GB的限制。

编译debugging设置为true在web.config中,但我得到不同的答案,我问每个人,debugging设置为true,导致每个aspx编译成ram随机区域,从而碎片该ram,并最终导致内存不足的问题?

Scott Guthrie(ASP.NET开发团队的经理)有一篇有趣的文章 。

为什么你不应该离开debug =“true”最重要的是:

  1. ASP.NET页面的编译需要更长时间(因为禁用了一些批量优化)
  2. 代码可以执行得更慢(因为启用了一些额外的debuggingpath)
  3. 运行时在应用程序中使用了更多的内存
  4. 从WebResources.axd处理程序下载的脚本和图像不会被浏览器caching,从而导致客户端和服务器之间的更多请求

他还提到了machine.config中的<deployment retail=”true”/ >标志,它允许全局覆盖机器上运行的所有应用程序(例如生产服务器)上的debug =“true”标志。


更新 :用debug="true"部署web应用程序仍然不好,你可以在Scott Hanselman最近的博客文章中阅读 :

这是debug =“true”不好的原因。 说真的,我们不是在开玩笑。

  • 覆盖请求执行超时使其有效无限
  • 禁用页面和JIT编译器优化
  • 在1.1中,导致CLR过多的内存使用,用于debugging信息跟踪
  • 在1.1中,closuresdynamic页面的批量编译,每页导致1个程序集。
  • 对于VB.NET代码,会导致过度使用WeakReference(用于编辑和继续支持)。

一个重要的注意事项:与有时认为的相反,在一个元素中设置retail =“true”并不是debugging=“真”的直接解毒剂!

除非实际需要debugging应用程序,否则在web.config中debugging标志应设置为false。

在debugging模式下运行可能会增加内存使用量,但不像您所说的那样严重。 但是,您应该将其设置为false以消除其影响,并查看是否可以注意到任何改进。

在debugging模式下运行时,垃圾收集工作方式不同。 variables的生存时间从实际使用扩展到variables的范围(能够在debugging器中显示值)。 这使得一些物体在被垃圾收集之前活得更久。

编译器在debugging模式下编译时不会优化代码,并且还会添加一些额外的nop指令,以便每条代码行至less有一条可放置中断点的指令。

在debugging模式下抛出exception需要相当长的时间。 (但是,通常代码不应该经常抛出exception。)

这绝对会影响内存,只要看看一些perfmon计数器,并对两种configuration进行比较。

如果您的网站有很多的文件,我会更关心在asp.net临时文件夹中的磁盘io。

几个问题…

  1. 你的App_Code中有很多文件吗?
  2. 你是否允许该网站是可更新的,或者你是发布它?
  3. 如果是的话,这个网站是经常更新还是有一个部署过程?
  4. 什么是硬件configuration?

为什么不使用多个configuration?

Web.Debug.Config – 打开了debuggingWeb.UAT.Config – 无论您的首选项Web.Release.Config – closuresdebugging

这样你可以最小化回归configuration错误,比如开发者用debug =“true”来检查web.config,

AFAIK“debug = true”不会导致你提到的情况。

我曾经遇到与运行中创build图像的ASP.NET应用程序相同的问题。

所以我觉得你有没有处理资源的问题。

如果您将具有代码隐藏文件的aspx文件部署到服务器。 当请求到达一个aspx时,它将被编译一次。 那么它将被存储到caching中,直到文件改变。

在生产系统上总是设置Debug = false。 正如该标志所示,在debugging开发系统时应该只设置为true。

这个标志与你的内存碎片问题无关。