我发布了一个WCF(C#)项目,我正面临" OutOfMemoryException"问题。 DLL使用Any CPU
构建。 AppPool内存设置设置为0(表示没有限制)。
我每分钟有大约1500个请求,每分钟大约有100个请求。该项目使用EntityFramework。应用程序中有缓存(它是字典)
我做了一些故障排除试图找出问题,但目前尚不清楚。我试图计算使用的总内存(通过调用GC.GetTotalMemory(false)
)和缓存列表的大小。获取OOM异常时,缓存大小约为7 MB(2500个对象,每个30 KB),使用的总内存在600 MB到1.5 GB之间变化。
很明显,内存未满,资源正由GarbageCollector
定期清除(内存大小不会一直增加)。因此,OOM异常不是因为内存已满。
主要是我在日志OOM异常中看到将对象序列化为JSON(我正在使用Newtonsoft)或对字符串应用某些操作(连接,替换,Regexreplace,...),以下是一些异常示例: / p>
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 :(得分:1)
似乎问题是长字符串。可能StringBuilder
在追加新内容时需要扩展内存。我不确定但是当这个操作发生时; StringBuilder
尝试双倍大小。我认为CLR无法分配大小超过2GB的对象以及它抛出OutOfMemoryException
的原因
答案 1 :(得分:1)
You are seeing address space fragmentation on 32 bit. The maximum available address space depends on the OS and exe, cold be 2,3 or 4 GB.
Run the IIS worker process as 64 bit so that your AnyCPU DLL can take advantage of that.