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

时间:2012-02-01 08:48:05

标签: c# out-of-memory memory-profiling

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

的线程
  

GC.GetTotalMemory()

  

PrivateMemorySize64()

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以考虑安装Windows的调试工具并使用adplus

  

ADPlus.vbs(ADPlus)是Microsoft产品支持服务(PSS)提供的一种工具,可以对任何停止响应(挂起)或失败(崩溃)的进程或应用程序进行故障排除。

基本上,您可以设置观察应用程序,当它崩溃时,它将捕获转储,然后您可以使用WinDBG / SOS进行分析。

答案 2 :(得分:1)

您可以使用MemoryFailPoint尝试为给定的操作提供一些保证

但是我建议隔离你的应用运行的进程,如果这是一个选项就转移到64位,你可能需要考虑降低一些性能,以便为你的内存使用提供合理的保证。

答案 3 :(得分:0)

如何使用弱引用进行缓存? clicky