C# 如何调查生产中的 OutOfMemoryException

C# How to investigate a OutOfMemoryException in production

我们在生产环境中使用 C# 运行 开发了一个 WCF 服务,它每隔几个小时就会崩溃一次,没有任何可观察到的模式。内存使用量将在 ~250mb 徘徊一段时间,然后突然内存使用量开始上升,直到它崩溃并在 4gb 时出现 OutOfMemoryException(这是一个 32 位进程)。

我们很难确定问题所在,我们记录的异常来自代码中的不同位置,可能来自另一个尝试使用一些内存的请求并且它收到了异常。

当进程为 4gb 时,我们进行了内存转储,当崩溃发生时,内存中有大约 750k 的数据库对象列表。我们已经查找了这些对象的查询,但无法查明加载整个 table 的对象。该服务使用 EF6 调用数据库。

还有一点要注意,这个问题在我们的预生产环境中从未发生过。如果要加载整个 table,数据库中的数据在我们的预生产环境中就足够了。可能是带有特定参数的特定调用触发了此问题,但我们无法查明它。

我不知道下一步该尝试什么来解决我们的问题。在这种情况下有没有可以帮助我们的工具?

谢谢

如果您想捕获所有 SQL 并且正在使用实体,您可以像这样打印出查询 Context.Database.Log = s => Debug.Print(s);

如果你稍微搞砸了,你可以让它输出到一个变量并将结果保存到文本文件或 Db。您必须将其包装在所有 Db 调用中——不确定您的项目有多大?

Context.Database.Log = null;

关闭它