【发布时间】:2011-09-28 14:13:57
【问题描述】:
我一直在尝试诊断此 Web 服务中的 30 MB 内存泄漏。它使用标准存储过程从 SQL 获得了一些批量数据。每个“批量”返回大约 10,000-50,000 行。 Web 服务生成其报告并将其发送给调用者。
似乎每次您调用此报告时,都会有 30 MB 的内存被“吃掉”并且没有被释放。因此,如果您拨打相同的电话约 1,000 次,则 3 GB 系统内存不足。如果您回收应用程序池,则会释放内存。你可以在那里坐一天,内存不会被释放。所以超时后网络服务器内存不足。
我单步执行代码,分析了它,最后确定是这 3 个“批量”获取获得了适量的数据。每个取出 10 MB,完成后不归还。存储的过程很好。调用的唯一奇怪之处在于它使用 LINQ 调用存储的过程并将数据转换为 Poco 对象,使用 XML 映射文件。
我尝试更改它,以便他们每次调用存储过程时都使用新的 DataContext,然后将 DataContext 设置为 null。我尝试将所有类型的对象设置为 null,然后调用 GC.Collect,内存仍然被吃掉,直到你回收应用程序池才被释放。
我会很感激任何线索。我怀疑这与 LINQ 和大数据返回有关。
【问题讨论】:
-
您能告诉我们您使用什么语言编写 Web 服务吗?这样我们可以更好地回答您的问题
-
C# 使用 SQL CREATE TYPE dbo.TableOfInts AS TABLE ( ID int ) 中的自定义数据类型请求数据
-
我会研究对 Poco 对象的翻译。
-
ie webservice 填写一个DataTable,里面装满了它想要的行的Identities 整数,然后存储的proc 返回这些行。显然,这个数据表可能很大。将其设置为 null 无效。
-
这是你的问题,将你的 datacontext 设置为 null 而不处理它只是删除了对它的引用,因此 GC 不会将它从内存中删除。记得在下面标记 Adrian 的回答,因为这就是他想要告诉你的。
标签: c# sql linq web-services memory-leaks