gpt4 book ai didi

c# - SQL Stored Proc 随着时间的推移消耗内存

转载 作者:太空宇宙 更新时间:2023-11-03 22:08:21 25 4
gpt4 key购买 nike

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

似乎每次您调用此报告时,30 MB 的内存都被“吃掉”而没有释放。因此,如果您打同一个电话大约 1,000 次,3 GB 系统就会耗尽内存。如果您回收应用程序池,则会释放内存。你可以在那里坐一天,mem 不会被释放。所以超时,网络服务器内存不足。

我逐步检查了代码,对其进行了分析,最后确定是这 3 个“批量”获取了适量的数据。每个取出 10 MB 并且在完成后不归还。存储过程很好。调用的唯一奇怪之处在于它使用 LINQ 调用存储过程并将数据转换为 Poco 对象,使用 XML 映射文件。

我尝试更改它,以便他们每次调用存储过程时都使用新的 DataContext,然后将 DataContext 设置为 null。我尝试将所有类型的对象设置为 null,然后调用 GC.Collect 并且 mem 仍在被吃掉并且在您回收应用程序池之前不会被释放。

如果有任何线索,我将不胜感激。我怀疑这与 LINQ 和大数据返回有关。

最佳答案

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

一些类实例必须被处置(在 .Net 中是这样称呼的)。事实上,每个实现 IDisposable 的对象都必须让开发人员处理其内存周期。

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

底线:处理掉您的一次性用品。

关于c# - SQL Stored Proc 随着时间的推移消耗内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com