asp.net項目發布容易忽略的debug=true


問題陳述

確保在每個asp.net 應用中web.config里面在<compilation>節中的“debug=false”。這個在開發中的缺省設置是true,而且他是我們經常的犯的錯誤,把這個缺省設置部署到在生產環境中的實際應用。你沒有必要設置為true,因為它會導致內存的總開銷和低效率。

保留debug=true會導致什么問題?

         當設置為true或者false,主要有3個主要的差別

1)       asp.net 過期時間

2)       批量編譯

3)       代碼優化

asp.net 過期時間

         當設置為debug=true時,asp.net 請求不會過期,這個會允許你用vs studio來按照你自己的步調來調式程序而不用擔心這個請求會突然消失。當然,在生產環境中,超時過期是確保請求不會被卡住,這就是針對第一個的理由。

批量編譯

簡單來說,當設置為true,我們不會進行批量編譯,而false 則會。

這是什么意思?

當一個 aspxasaxascx頁面第一次被請求,它會被編譯成一個dll程序集。這個程序集有一個類似3ks0rnwz.dll的名字(8個字符),里面保存的是實際的ascxasaxaspx的類(不是code behind 的代碼),這個文件在C:"WINDOWS"Microsoft.NET"Framework"版本"Temporary ASP.NET Files文件夾的應用程序名下面。

那些code behind的類被編譯到程序集的主dll中,他和其他的dll一起放在應用程序的bin目錄下,拷貝映射到asp.net 臨時目錄。

回到3ks0rnwz.dll… 如果我們把debug設置為true,那么會為每個aspxasaxascx頁面創建一個dll,而且是debug模式的dll,所以如果你有100個頁面,那會創建100個程序集,他們會在頁面被請求的時候創建。

如果我們把debug設置為false,那會批量編譯。意思是第一次請求任何頁面的時候,會編譯整個應用程序,生成一個很大的dll,這是一個事實,但有些修正,用戶控件(ascx頁面)會被編譯成到一個分開的程序集中,和aspx頁面分離,而aspx頁面會分組按他們所引用的用戶控件分組編譯,global.asax也是分開編譯。編譯也是基於目錄的,即如果應用中還有子目錄,那子目錄也是單獨編譯,避免同名沖突,因為在可能有相同名字的aspx頁面在不同的目錄中。但總的來說,相比100dll,你肯那個只有4 5dll

因為代碼都是相同的,所以合在一起的dll合單獨的dll的大小並沒有很大的差別,但那有一個很大的總體消耗,對每個dll而言。在dubug模式下編譯的dll有一個為了調試而需要的資源消耗。最重要的是,這些dll不會在內存中一個挨着一個排列着,所以,針對有很多的dll的情況,你會開始在虛擬內存中搞出碎片,這將會更難的找到足夠的空間來存儲托管堆,很有可能會導致內存異常。

另一種情況是,如果設置debug=false,你修改了一個aspx頁面,這個頁面就需要重新編譯,但這不會導致應用程序域(appdomain)重新加載,這樣整個程序就不會重新批量編譯,單個頁面會被單獨編譯,生成一個dll。所以不要在一個運行着的服務器上經常行的改變你的aspx頁面。

machine.config中有一個配置選項,允許重新編譯多少個頁面而應用程序域不重啟動。缺省的是15,所以在有15個重新編譯行為之后,應用程序域會重新啟動,這個跟你修改web.config bin目錄導致應用程序域重啟一樣。

代碼優化

JIT為了能夠單步的調試代碼,並不能夠真的優化代碼,所以debug模式下的代碼性能就會比release模式的要差。

如何在內存dump文件找出這些?

要確定你的應用程序時候運行在debug模式下,在sos.dll中有一個很靈巧的命令是 !finddebugtrue,它會列出你需要的信息。

0:016> !finddebugtrue

Debug set to true for Runtime: 61b48dc, AppDomain: /MyDebugApplication

Debug set to true for Runtime: 1f50e6d8, AppDomain: /MemoryIssues

Total 16 HttpRuntime objects

要找出你忘記編譯成release模式的模塊,你可以運行 !finddebugmodules

0:016> !finddebugmodules

Loading all modules.

Searching for modules built in debug mode...

 

MyDebugApplication.dll built debug

MemoryIssues.dll built debug

fl4sq-9i.dll built debug

wepr1t3k.dll built debug

r9ocxl4m.dll built debug

zmaozzfb.dll built debug

 

Done Seaching

那些8個字母的dllJIT引擎編譯的aspx頁面。

噢,前面我忘記了….當你從debug=true改變到debug=false時,把 asp.net 臨時目錄里的程序集刪除掉,這樣你不會有那些導致不會批量編譯的舊垃圾。

asp.net 2.0中,在machine.config中有一個開關量,可以吧debug=true 關閉,所有有了他,你不必擔心那個應用程序是debug模式或不是。

<configuration>

    <system.web>

          <deployment retail=”true”/>

    </system.web>

</configuration>

本文轉載自http://blog.csdn.net/snoopy83101/article/details/4545375

本人只是為了自己和看到此文字的人能加深記憶。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM