c# - 使用 System.Threading.ReaderWriterCount 获取内存不足异常

标签 c# asp.net out-of-memory

我有一个 asp.net 应用程序,它在 DotNetNuke 上运行,在负载下我们偶尔会遇到内存不足异常。

我已经将它转储到 windbg 中。

!dumpheap -stat 的结尾是

1192a588    88684      2128416 AutoMapper.MappingEngine
79333594     9482      2266348 System.Byte[]
134b0034    88695      2838240 System.EventHandler`1[[AutoMapper.TypeMapCreatedEventArgs, AutoMapper]]
13d8703c    88684      4611568 System.Collections.Generic.Dictionary`2[[Castle.DynamicProxy.Generators.CacheKey, AutoMapper],[System.Type, mscorlib]]
13d86dc8    88684      4611568 Castle.DynamicProxy.ModuleScope
13d865bc    88684      4611568 System.Collections.Generic.Dictionary`2[[AutoMapper.Internal.TypePair, AutoMapper],[AutoMapper.IObjectMapper, AutoMapper]]
79327434    88703      4612556 System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Int32, mscorlib]]
6c38e4e4    88684      5675776 System.Threading.ReaderWriterLockSlim
79330b24    87736      6458012 System.String
000d9c88      129     24186884      Free
793042f4   221202    101117016 System.Object[]
6c38e4a0 22703104    544874496 System.Threading.ReaderWriterCount

我找不到关于 System.Threading.ReaderWriterCount 的太多信息,因为这似乎是问题所在。

可能的原因是什么?或者如果失败了,下一步最好的解决办法是什么?

根据给定答案的指针,我查看了 ReaderWriterLockSlim。我没有直接使用它,但我看到它有 88684 个实例,深入挖掘我看到相当多的类具有该数量的实例,指向 AutoMapper.MappingEngine。这应该是一个单例,所以我查看了它的创建位置。我怀疑它是 DI 容器并围绕它做了一些更改以查看它是否有帮助

最佳答案

ReaderWriterLockSlim 在内存占用方面并不便宜 - 这可能是您的 ReaderWriterCount 实例激增的原因。参见 here有关 Reflector 的详细信息。

你能减少这个类的使用吗?也许不是所有的都需要读/写锁,简单的 Mutex/lock() 可能有用吗?

另请注意,此类是 IDisposable - 也许您不是在使用完它们后 Dispose() 处理它们?

关于c# - 使用 System.Threading.ReaderWriterCount 获取内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4066286/

相关文章:

asp.net - 无法将 Hangfire 安装到我现有的项目中

c# - 仅将 ASP.NET MVC 应用程序管理站点锁定到 LocalHost

windows - 32 位进程上线程的最大内存大小

java - JVM 如何因 OOM 异常而死掉?

c# - 与 Entity Framework 一起使用的表达式<Func<TEntity, bool>> 嵌套

c# - 使用 ADFS 对 ASP.NET Web Api 进行身份验证

ASP.Net Core 嵌套区域

c# - Entity Framework 6 内存使用量达到 2GB

C# 等效于 Java Class<?扩展基地>?

c# - Windows 关闭时触发应用程序退出