8

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

GC.GetTotalMemory()

或者

PrivateMemorySize64()

一秒钟知道什么时候开始分析事物?我还没有研究过商业分析器,我有点担心它们对性能的影响,这也可能在实际问题分析中给出错误的结果。

4

4 回答 4

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

于 2012-02-01T10:13:05.377 回答
1

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

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

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

于 2012-02-01T09:11:38.323 回答
1

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

但是我建议隔离您的应用程序正在运行的进程,如果可以的话,迁移到 64 位,您可能需要考虑降低一些性能,以便为您的内存使用提供合理的保证。

于 2012-02-01T10:00:05.477 回答
0

使用弱引用进行缓存怎么样? 咔嚓

于 2012-02-01T08:51:40.503 回答