C#内存不足异常 - 警告策略

wei*_*mat 8 c# out-of-memory memory-profiling

在一个复杂的多线程应用程序中,我每周会遇到一次内存不足异常.应用程序通过多个套接字发送/读取大量数据,其中读取数据被缓存以避免网卡缓冲区溢出.
分析内存异常的最佳策略是什么?在正常运行时,应用程序在Process Explorer中显示的大小为"所有堆中的总字节数",最大为1.5 GB.
拥有一个轮询的策略也是一种策略

GC.GetTotalMemory()

要么

PrivateMemorySize64()

一秒钟知道何时开始分析事物?我还没有考虑商业剖析器,我有点担心它们对性能的影响,这可能会给实际问题分析带来错误的结果.

AMi*_*ico 3

您的内存可能因大量字符串操作或其他创建和释放小内存块的操作(例如装箱/拆箱)而产生碎片。

当 CLR 无法分配足够大的空闲内存块时,您将收到此异常。

我使用“CLR Profiler”并检查内存分配。如果您看到大量白点(空闲块)并且没有大的空闲块,那么您需要开始查看如何分配对象。

例如,在将一个字符串分配给另一个字符串之前,首先检查字符串是否不同。使用 StringBuilder 是所有情况,消除装箱和其他内存优化。

我使用这种技术并完全消除了异常,除了二进制反序列化的已知问题。

重新发现托管代码中丢失的内存优化艺术http://msdn.microsoft.com/en-us/magazine/cc163856.aspx

调查内存问题 http://msdn.microsoft.com/en-us/magazine/cc163528.aspx

Visual Basic .NET 中的性能优化: http ://msdn.microsoft.com/en-us/library/aa289513 (v=vs.71).aspx

  • 大多数字符串应该是可重定位的,因此不应导致内存碎片。LoH 碎片可能是一个问题,但如果您使用许多足够大的字符串以 LoH 结尾,那么您可能做错了什么。 (2认同)