【发布时间】:2011-11-21 02:08:04
【问题描述】:
我遇到的问题是,我的 ASP.NET 4 MVC 2 + WCF 应用程序在 Windows 2008 64 位 应用程序中使用了大量内存运行几分钟后几乎所有可用内存(8 GB)(我们确实有几个工作进程正在运行)。
在使用 ANTS Memory Profiler 进行分析后,它显示出一些有趣的结果:
- .NET 托管内存从 15 MB 增加到 40 MB,但这要归功于我们在程序中所做的缓存机制。 但是 .NET 本身分配了将近 180 MB 的可用空间,这是出乎意料的。
- 在负载测试运行大约 3 分钟后,非托管内存大小显着增加直到 120 MB(尽管我们的应用程序没有明确使用任何 P/Invoke 或 COM 对象。但是我们确实使用了一些在使用后释放的 COM+ 对象在 finally 块中)。
- 内存变得支离破碎。
- 上述第 1 项和第 2 项导致整个应用程序在负载测试运行几分钟后使用大约 350 MB,但如果我们不停止测试,它将继续进一步增长.
根据上面的第 1 项,我测试了一些应用程序以测试问题是由于我们的应用程序还是 WCF 引起的。 测试应用程序只是将 XML 数据(大约 300KB)加载到多线程应用程序中的数据集。当逻辑存储在 EXE 程序中时,应用程序从完成后的 24 MB 私有字节中仅使用 200 KB(从 40 KB 开始的额外 120 KB 用于未使用的内存)托管内存(这是可以接受的); 但当逻辑托管在 WCF 中时,应用程序使用 66 MB 托管内存(从 64 MB 可用/未使用托管内存开始,额外增加 61 MB)。所以看来WCF / ASP.NET是导致内存增加很多的)。
- 为什么 .NET 在堆中分配这么多空闲空间? 了解空闲空间可能是在内存快照过程中被 GC-ed 的 Gen 0/Gen 1/Gen 2,但我没有认为应用程序真的用掉了那么多内存。
- WCF 的行为是否正常?如果是,有什么方法可以改变行为以减少内存占用?
- 如何发现非托管内存泄漏,尤其是我没有明确使用非托管代码?
感谢您对上述问题的建议。
提前致谢,
威利
【问题讨论】:
-
这里没有任何有用的信息...使用 350 MB 可能是正常的,但与 8GB 相比还有很长的路要走。稍后运行您的分析器,然后使用它找出内存的去向。
-
对 WCF 的调用频率如何?您可能会看到用于处理尚未收集的消息的临时缓冲区
标签: .net wcf memory-management garbage-collection