Wil*_*rno 5 .net wcf garbage-collection memory-management
我遇到的问题是,我的ASP.NET 4 MVC 2 + WCF应用程序在负载测试期间使用Windows 2008 64 位应用程序中的大量内存,运行几分钟后它将耗尽几乎所有可用内存(8 GB) (我们做了有几个工作进程在运行)。
使用ANTS Memory Profiler进行分析后,它显示了一些有趣的结果:
根据上面的第1项,我测试了一些应用程序来测试问题是否是由于我们的应用程序或WCF引起的。测试应用程序只是将 XML 数据(约 300KB)加载到多线程应用程序中的数据集。当逻辑存储在 EXE 程序中时,应用程序在完成后仅使用 24 MB 专用字节中的 200 KB(从开始时额外使用 120 KB,其中 40 KB 用于未使用的内存)托管内存(这是可以接受的);但是当逻辑托管在 WCF 中时,应用程序使用 66 MB 托管内存(从 64 MB 空闲/未使用的托管内存开始额外使用 61 MB)。所以看来 WCF / ASP.NET 是导致内存增加很多的原因)。
感谢您对上述问题的建议。
提前致谢,
威利
WCF 使用临时缓冲区来处理消息。您认为的内存泄漏可能是尚未收集的临时缓冲区。
为避免始终创建新缓冲区,WCF 使用BufferManager重用缓冲区,最高可达maxBufferPoolSize (链接到此处的元素)指定的限制,默认情况下为 512KB。任何超出此限制的请求都会导致创建新的缓冲区,这些缓冲区永远不会重用,并且必须进行垃圾收集。
另一个要检查的选项是 maxBufferSize,它限制 BufferManager 可以返回的最大缓冲区大小。较大的缓冲区不会被池化,并且必须被垃圾收集。如果您使用大消息,则可以通过增加此属性来减少临时缓冲区。
尝试增加maxBufferPoolSize看看是否可以减少内存使用。我强烈建议不要最大化它,因为池中的缓冲区永远不会释放,直到应用程序域(即应用程序池)回收。高流量时期可能会导致大量内存被使用但从未被释放。
| 归档时间: |
|
| 查看次数: |
7896 次 |
| 最近记录: |