2012-02-01 87 views
8

在复杂的多线程应用程序中,我每周可能会遇到内存不足异常。应用程序通过多个套接字发送/读取海量数据,读取数据缓存以避免网卡缓冲区溢出。
什么是分析内存异常的最佳策略?在正常运行时,应用程序在Process Explorer中显示的大小为“所有堆中的总字节数”高达1.5 G字节。
难道是一个策略,以具有螺纹,其是轮询任C#内存不足异常 - 警告策略

GC.GetTotalMemory()

PrivateMemorySize64()

一次第二要知道什么时候开始分析事情?我还没有研究过商业分析器,而且我对它们的性能影响有点担忧,它们可能给实际问题分析带来错误的结果。

+1

您的缓存工作如何?我会研究一下不同的缓存分配策略。 – CodesInChaos 2012-02-01 10:16:53

+0

为了澄清,你知道是什么导致了内存不足异常,并且你正在寻找一种方法来配置应用程序中的缓存,以避免这种情况发生?还是你不知道究竟是什么原因造成的,你想调试问题? – svick 2012-02-01 11:21:52

回答

3

您的内存可能正在被众多字符串操作或创建和释放小块内存的其他操作(如装箱/拆箱)碎片化。

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

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

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

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

http://msdn.microsoft.com/en-us/magazine/cc163856.aspx

重新发现内存优化失落的艺术托管代码调查内存问题http://msdn.microsoft.com/en-us/library/aa289513(五在Visual Basic .NEThttp://msdn.microsoft.com/en-us/magazine/cc163528.aspx

性能优化= vs.71).aspx

+2

大多数字符串应该是可重定位的,因此不应导致内存碎片。 LoH碎片可能是一个问题,但是如果你使用了足够多的字符串来结束LoH,你可能会做错某些事情。 – CodesInChaos 2012-02-01 10:15:14

+0

其他内存优化是什么意思? 在一部分我使用严重拆分,正则表达式,堆栈和列表。需要重新检查拳击 – weismat 2012-02-01 10:52:26

+0

如果没有足够大的块,则不能重新定位内存。这就是引发内存不足异常的原因。我从来没有见过LOH引起内存不足的例外。就是这样,一堆可以分配大块内存,而不需要找到一个大的自由连续的内存块。 – AMissico 2012-02-01 10:52:52

0

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

+3

只是FYI,这是来自弱引用Guildlines:“避免使用弱引用作为内存管理问题的自动解决方案,而应该制定有效的缓存策略来处理应用程序的对象。” – 2012-02-01 09:25:10

+0

没有太多的地方弱引用可能会有所帮助 - 我想我会将这个过程分成两个,首先是可用数据空间的两倍。到目前为止,我出于行政原因避免了这一点。 – weismat 2012-02-01 09:37:30

1

你可能会考虑安装调试工具的Windows和使用adplus

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

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

+0

我可能走这条路 - 我想我会将它添加到我的调度任务列表中,以便它每天都会启动,因为每天都需要重新开始(因为.exe每天也会启动)。 – weismat 2012-02-01 09:40:36

1

可以使用MemoryFailPoint,试图给你一个给定的操作

一些保证,但我建议隔离你的应用程序在运行的过程中,迁移到64位,如果这是一个选项,您可能需要看看降低一些性能,让你合理保证你的内存使用量。