Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#内存不足异常-警告策略_C#_Out Of Memory_Memory Profiling - Fatal编程技术网

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

C#内存不足异常-警告策略,c#,out-of-memory,memory-profiling,C#,Out Of Memory,Memory Profiling,在一个复杂的多线程应用程序中,我可能每周遇到一次内存不足异常。应用程序正在通过几个套接字发送/读取大量数据,在这些套接字中读取的数据将被缓存,以避免网卡缓冲区溢出。 分析内存异常的最佳策略是什么?在正常运行期间,应用程序在Process explorer中显示的“所有堆中的总字节数”最大为1.5 GB。 有一个线程正在轮询,这是一种策略吗 GC.GetTotalMemory() 或 PrivateMemorySize64() 一秒钟一次,知道什么时候开始分析事情?我还没有研究过商业分析器,我有点

在一个复杂的多线程应用程序中,我可能每周遇到一次内存不足异常。应用程序正在通过几个套接字发送/读取大量数据,在这些套接字中读取的数据将被缓存,以避免网卡缓冲区溢出。
分析内存异常的最佳策略是什么?在正常运行期间,应用程序在Process explorer中显示的“所有堆中的总字节数”最大为1.5 GB。
有一个线程正在轮询,这是一种策略吗

GC.GetTotalMemory()

PrivateMemorySize64()


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

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

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

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

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

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


但我建议隔离应用程序运行的进程,如果选择64位,您可能需要考虑降低一些性能,以合理保证内存使用。

您的内存可能因大量字符串操作或其他创建和释放小块内存的操作(如装箱/取消装箱)而被分割

当CLR无法分配足够大的可用内存块时,将出现此异常

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

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

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

在托管代码中重新发现丢失的内存优化艺术

调查内存问题


Visual Basic.NET at(v=vs.71).aspx中的性能优化仅供参考,这来自弱引用指南:“避免使用弱引用作为内存管理问题的自动解决方案。相反,应制定有效的缓存策略来处理应用程序的对象。”弱引用可能会有所帮助的地方并不多——我想我应该先将流程分成两部分,以将可用数据空间增加一倍。到目前为止,由于管理方面的原因,我一直避免这样做。我可能会这样做——我想我会将它添加到我的计划任务列表中,这样它每天都会启动,因为每天都需要一个新的开始(因为.exe也每天都会启动)。大多数字符串应该是可重新定位的,因此不会导致内存碎片。LoH碎片可能是一个问题,但是如果您使用的字符串足够大,以至于可以在LoH上结束,那么您可能做错了什么。您所说的其他内存优化是什么意思?有一部分我使用了大量的拆分、正则表达式、堆栈和列表。需要重新检查Boxing如果没有足够大的块,则无法重新定位内存。这就是引发内存不足异常的原因。我从未见过LOH导致内存不足异常。这就是它的用途,一堆大的内存块可以被分配,而不需要找到一个大的连续空闲内存块。@weismat;使用锯齿状数组而不是多维数组,避免重复/不必要地创建对象。请参阅我添加到答案中的链接。确保您在@AMissico上查看了内存问题调查,我认为您不清楚普通堆和大对象堆(LOH)之间的区别。普通堆中的对象始终可以重新定位。LOH中的对象永远不会重新定位。当从LOH进行分配时,您需要找到可用的连续虚拟内存块,否则将得到OOM。这就是为什么LOH的碎片可能是个问题,而不是普通堆的碎片。缓存是如何工作的?我会研究一种不同的缓存分配策略。为了澄清这一点,您是否知道导致内存不足异常的原因?您是否正在寻找一种在应用程序中配置缓存的方法,以避免出现这种情况?或者是因为你不知道到底是什么原因导致的,你想调试这个问题?