运行 CLRProfiler 时不会出现的内存泄漏

Memory leak which does not appear when running with CLRProfiler

我有一个非常烦人的问题。 Out 项目在 Windows Server 2012 R2 系统上作为 Windows 服务运行。它是一个完全托管的应用程序,处理一些数据文件以收集测量统计数据等。

我在某个地方有内存泄漏,我用 Perfmon 确认了这一点:我可以看到 Gen2 堆缓慢但稳定地增长。半到一小时后,应用程序崩溃。

我已经将一个控制台应用程序放在一起来托管同一个应用程序,只是为了获得更多控制权并排除服务内容。那里发生了同样的事情。 然后我用 CLRProfiler 启动了控制台应用程序,当我看到内存使用率一直很好而且很低时,我简直不敢相信自己的眼睛,同时正在处理完全相同的文件!

此外,内存泄漏不会出现在我们当前的开发环境中,只会出现在生产环境中。现在唯一的区别是生产版本使用 Oracle.ManagedDataAccess 数据提供者,而开发版本使用 MySQL。即使托管 Oracle 提供程序有一些错误或任何问题,当 运行 分析器我看不到任何东西时,这仍然很疯狂。

应用程序非常复杂,真的很难,如果没有分析器的帮助,几乎找不到漏洞。我很失望,希望任何人都可以提出一些可以挽救这一天的建议。提前致谢。

实际上,事实证明它也与 CLRProfiler 一起泄漏,但速度慢得多,可能由于不断的分析,整个执行速度变慢了。这就是为什么我没有注意到它。我不得不 运行 一小时后才发现泄漏。

事实上 Oracle.ManagedDataAccess 驱动程序似乎存在问题,至少在我使用的版本(相当旧的版本)中是这样。泄漏似乎是由未发布的 OracleParameter 对象引起的。我会尝试最新版本,我真的希望它已经修复,因为使用非托管 ODP.NET 是我职业生涯中最糟糕的噩梦之一。

感谢大家花时间提供帮助。

更新: 对于未来的读者,我可以确认最新版本(Oracle.ManagedDataAccess.dll,版本 4.121.2.0)已解决此内存泄漏问题。