2015-07-28 54 views
4

我有一個WCF(C#)項目發佈,並面臨「OutOfMemoryException」問題。這些DLL使用Any CPU構建。 AppPool內存設置被設置爲0(表示沒有限制)。 我每分鐘有大約1500個請求,並且每分鐘有大約100個其他請求。該項目使用EntityFramework。有應用程序緩存(這是一個字典)OutOfMemoryException - WCF服務

我做了一些故障排除,試圖找出問題,但目前尚不清楚。我嘗試計算使用的總內存(通過調用GC.GetTotalMemory(false))和緩存列表的大小。在獲得OOM例外時,高速緩存大小約爲7 MB(每個30 KB的2500個對象),並且使用的總內存在600 MB到1.5 GB之間變化。

因此很明顯內存不足並且資源被GarbageCollector定期清除(內存大小不會一直增加)。因此,OOM異常並不是因爲內存已滿。

主要是在將對象序列化爲JSON(我正在使用Newtonsoft)或對字符串應用某些操作(連接,替換,Regexreplace,...)時,在日誌中看到OOM異常,下面是異常的一些示例:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount) 
at System.Text.StringBuilder.Append(Char* value, Int32 valueCount) 
at System.Text.StringBuilder.Append(String value, Int32 startIndex, Int32 count) 
at System.Text.RegularExpressions.RegexReplacement.Replace(Regex regex, String input, Int32 count, Int32 startat) 
at System.Text.RegularExpressions.Regex.Replace(String input, String replacement, Int32 count, Int32 startat) 
at System.Text.RegularExpressions.Regex.Replace(String input, String replacement) 
at System.Text.RegularExpressions.Regex.Replace(String input, String pattern, String replacement) 

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
at System.String.ReplaceInternal(String oldValue, String newValue) 
at System.String.Replace(String oldValue, String newValue) 

什麼可以做,以重現該問題的任何意見或建議?

+0

驗證過程的位數。你會發現它是32位的。 – usr

+0

我該如何獲得比特?該DLL使用「任何CPU」設置構建,並且服務器運行Windows Server 2012 x64。所以DLL的正常行爲是64! – Mostafa

+0

DLL承擔主機進程的位數。使用Process Explorer找出或Response.Write(IntPtr.Size)。 – usr

回答

1

您正在看到32位的地址空間碎片。最大可用地址空間取決於操作系統和exe,冷2,3或4 GB。

以64位身份運行IIS輔助進程,以便您的AnyCPU DLL可以利用此優勢。

+0

謝謝,這解決了我的問題。 DLL現在以64位模式工作。 – Mostafa

1

看來問題在於長字符串。可能StringBuilder想要在添加新內容時擴展內存。我不確定,但是當這個操作發生的時候; StringBuilder嘗試雙倍大小。我認爲CLR不能分配大於2GB的大小的對象,並且爲什麼它會拋出OutOfMemoryException

+0

「'ExpandByABlock'」:StringBuilder在以後的框架版本中使用小塊。 – usr

+0

我有這個想法,但我相信我沒有2GB大小的對象/字符串。例如,在問題中粘貼的第一個異常的大小爲10 KB,並調用替換函數來刪除某些單詞(將其替換爲空)。所以我不確定這個問題! – Mostafa

+0

也許你可以托盤運行一些分析工具,並專注於內存測量。另一種可能性是你嘗試序列化的樹實際上是帶有一些循環引用的圖形 –