wei*_*mat 8 c# out-of-memory memory-profiling
在一个复杂的多线程应用程序中,我每周会遇到一次内存不足异常.应用程序通过多个套接字发送/读取大量数据,其中读取数据被缓存以避免网卡缓冲区溢出.
分析内存异常的最佳策略是什么?在正常运行时,应用程序在Process Explorer中显示的大小为"所有堆中的总字节数",最大为1.5 GB.
拥有一个轮询的策略也是一种策略
GC.GetTotalMemory()
要么
PrivateMemorySize64()
一秒钟知道何时开始分析事物?我还没有考虑商业剖析器,我有点担心它们对性能的影响,这可能会给实际问题分析带来错误的结果.
您的内存可能因大量字符串操作或其他创建和释放小内存块的操作(例如装箱/拆箱)而产生碎片。
当 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
| 归档时间: |
|
| 查看次数: |
2798 次 |
| 最近记录: |