2008-12-17 57 views
1

環境: Windows 2003 Server(32位); IIS6,ASP.NET 2.0(3.5); 4Gb Ram; 1工作進程ASP.NET - 單個大型Web請求觸發器System.OutOfMemoryException - 仍有大量可用內存

我們有一個情況,我們有一個非常大的System.XmlDocument被加載到內存中,然後它進入一個編譯的XSL轉換。 發生什麼事情時,Web請求進入服務器正在與2500Mb的可用系統內存空閒狀態。

隨着XML DOM被填充,可用內存下降約500Mb,此時我們得到System.OutOfMemoryException事件。在這一點上,系統理論上仍然有2000Mb的可用內存可用於服務請求(根據Perfmon)。

我已經在相關的問題:

1)在堆棧中的什麼水平,這是內存不足的限制得到滿足? OS? IIS? ASP.NET?工作流程?這是每個Web請求限制嗎?

2)此限制是否可以在某處進行配置?

3)爲什麼不能訪問完整的可用系統內存?

+0

我也想到了這一點,我認爲對操作系統的工作進程或對IIS工作進程的限制或對應用程序池的限制都有限制。祝你好運:\ – Shawn 2008-12-18 00:04:46

+0

x86(32位)是一個痛苦的世界。我知道這是一個延伸,但是您可以在64位版本的Windows Server上運行此代碼嗎?在服務器上64位是非常多的,我的意思是這個字面上,*免費perforamnce * – 2008-12-18 04:34:03

+0

謝謝傑夫,x64(和32GB內存)是2個月的時間了,所以我們可能只能掛在那裏。我喜歡在軟件問題上拋硬件! – 2008-12-18 09:10:47

回答

1

1)我會猜測工作進程,但這應該可以在IIS內配置爲工作進程可以使用的內存限制。另一個因素是您的軟件使用什麼級別的位,例如32位的物理限制爲4 GB,因爲這是總地址空間。

2)可能但不要忘記,內存碎片可能會比你想像的更快地發揮內存溢出的作用,例如,如果有連續1000 Mb內存的內存請求,那麼在當前內存中可能不一定會找到該內存。

3)您是否檢查過轉儲數據以查看引發異常時內存中的內容?如果沒有,有辦法獲得內存快照,看看它看起來像什麼,因爲這可能會給你更多線索關於正在發生的事情。

0

我確定這裏有一些光明的頭可以回答你的具體問題,但你問自己是否有另一種方法去做你想要的東西?我特別指您可能不想處理一個非常大的XML文檔,但您可能更具體地想要將某些內容返回給客戶端。您是否可以重寫代碼以完全避免此XML文檔,或者可能不會同時將其全部加載到內存中,並且仍會產生相同的最終結果?

+0

是的,我知道有很多更好的方法可以使用更高效的體系結構來實現相同的結果。 但是,這是傳統轉換,其複雜的商業規則花費了100多天的時間來重新設計。 配置我們的服務器來處理這個請求(如果可能的話)更有意義。 – 2008-12-18 00:08:29

0

1)不知道。檢查你的日誌。
2)IIS限制內存分成網站/應用程序池。檢查您的設置。
3)服務器都是關於正常運行時間;如果一個應用程序佔用了其他人所有的資源。這就是爲什麼像IIS這樣的企業應用程序會限制內存以防止逃跑從而取消整個服務器。

+0

這是在ASP.NET中運行的引發System.OutOfMemoryException的CLR。我自己的知識和研究並不一定告訴我IIS下面的堆棧在哪裏受到這樣的限制?也許別人知道? – 2008-12-18 00:13:50

1
  1. 您正在運行一個進程。一個進程只能訪問2個內存。此任務與此過程中運行的其他任何內容共享內存,因此這一點代碼無法獲得完整的2個演出 - 即使它可用。 操作系統上還有一個3 gig的開關。我相信這是一個註冊表設置。但是您必須搜索MSDN才能找到該信息。

但實際上,您需要以另一種方式做到這一點。可能通過切換到SAX風格的XML解析器。