SQL存储过程会随着时间消耗内存

本文关键字:内存 时间 存储过程 SQL | 更新日期: 2023-09-27 18:10:01

我一直在尝试诊断这个web服务中的30 MB内存泄漏。它使用标准存储过程从SQL中获得一些批量数据。每个"批量"返回大约10,000-50,000行。web服务生成它的报告并将其发送给调用者。

似乎每次你调用这个报告30 MB的内存被"吃掉"而不是释放。所以如果你打1000次同样的电话,3gb的系统就会耗尽内存。如果您回收应用程序池,内存将被释放。你可以在那里坐一天,记忆不会被释放。因此,随着时间的推移,web服务器将耗尽内存。

我遍历了代码,分析了其中的内容,并最终确定是这3个"批量"获取获得了适量的数据。每个占用10mb,并且在完成后不归还。存储过程没有问题。这些调用的唯一奇怪之处在于,它使用LINQ调用存储进程,并使用XML映射文件将数据转换为Poco对象。

我试着改变它,所以他们使用一个新的DataContext每次存储过程被调用,然后设置DataContext为空。我尝试将所有类型的对象设置为null,然后调用GC。收集和内存仍然被吃掉,直到你回收应用程序池才释放。

我很感激任何线索。我怀疑这与LINQ和大数据返回有关。

SQL存储过程会随着时间消耗内存

这是垃圾收集的丑陋一面:开发人员倾向于认为他们不再需要担心释放内存。但这并不完全正确!

一些类实例必须被dispose(在。net中被称为dispose)。实际上,每个实现IDisposable的对象都必须由开发人员处理其内存周期。

流就是一个很好的例子。流是一次性的,它们通常携带大量的数据(比一个简单的字符串大)。想象一下,一个服务每5秒处理一个2KB的流。这并不多,对吧?比如说,它是一个小的XML。但是如果你不处理它会发生什么呢?当然,你可以自己计算一下,但我会给你一个结果:~33.7 MB未使用的垃圾。

底线:扔掉你的一次性用品。