Asp.net
確定誰/什麼在 w3wp.exe 中保留了 5.5 GB 的虛擬記憶體
在我的機器(XP,64)上,ASP.net 工作程序(w3wp.exe)總是在啟動時保留 5.5GB 的虛擬記憶體。無論它託管的 Web 應用程序如何(它可以是任何東西,甚至是 aspx 中的空網頁),都會發生這種情況。
這個大的舊虛擬記憶體塊在程序開始時被保留,所以這不是某種逐漸的記憶體“洩漏”。
對windbg 的一些窺探表明,記憶體問題是Private、Reserved 和RegionUsageIsVAD,這表明它可能是呼叫VirtualAlloc 的人的工作。它還表明,有問題的記憶體被分配/保留為 4 個大塊,每個 1GB 和幾個較小的塊(每個 1/4GB)。
所以我想我需要弄清楚誰在呼叫 VirtualAlloc 並保留所有這些記憶體。我怎麼做?
在分配記憶體之前將調試器附加到程序很棘手,因為 w3wp.exe 是由 svchost.exe 啟動的程序(即 IIS/ASP.Net 過濾器),如果我嘗試自己啟動它以調試它它只是在沒有所有這些大量記憶體保留的情況下關閉。此外,如果我重用它們,命令行參數是無效的(這是有道理的,因為它是由呼叫程序創建的管道)。
我可以在事後將它附加到程序中(這就是我找到有問題的記憶體區域的方式),但我不確定當時是否有可能確定誰分配了什麼。
David Wang回答了一個類似的問題:
$$ … $$ASP.Net 性能開發人員告訴我:
- 保留的虛擬記憶體無需擔心。您可以將其視為 CLR 的性能/記憶體先決條件。並且重載測試表明這沒什麼好擔心的。
- System.Windows.Forms - 它不是由空的 hello world ASPX 頁面拉入的。您可以使用 Microsoft 調試工具和“sx e ld system.windows.forms”來確定在執行時實際將其拉入的內容。或者您可以通過 ildasm 找到依賴項。
- mscorlib - 確保它是正確的 GAC’d 和 NGen’d。