如果有足够的可用内存,则跨不同应用程序池的多个OutOfMemoryException

问题描述

我正试图找出可能导致OutOfMemoryExceptions的原因。

以下是关于我们的设置的事实:

  • 我们在同一Windows 2019服务器上运行大约70个.NET Framework 4.8 Web应用程序,每个应用程序都在各自的应用程序池中。
  • 应用程序以64位模式运行(已在任务管理器中验证)。
  • 整天中,我们看到大量OutOfMemoryExceptions在不同的应用程序中并存。
  • OutOfMemoryExceptions发生在代码的不同部分。
  • 整体内存使用量约为计算机容量的85%,这是一台大型计算机,即可用内存约为30-40 GB。机器整天倾向于处于这种使用水平(我想这是可以预期的)。
  • 遇到错误的应用程序正在使用3到6 GB的RAM。
  • 分页文件设置为自动管理
  • 未设置应用程序池上的专用和虚拟内存限制(根据IIS中的设置将其设置为0)
  • 我们已经进行了内存转储并分析了DotMemory中的使用情况,但没有发现任何特别意外的情况。

据我了解,可能会出现内存不足错误的一些原因,但是在这种情况下,它们对我来说都没有道理。

我们似乎并没有真正用完计算机上的内存,因为我们有大量的内存和大量的页面文件可用空间。

这些是现代的64位应用程序,大多数旧有内存限制的问题(例如无法分配大于2 GB的对象)不再适用。

如果问题是由于碎片导致无法分配足够的连续空间,那么我们可以期望首先看到与较大对象相关的错误。但是,我们看到的行为是对象簇相对较小(最多10s至100 MB)的异常簇。

可能是问题所在,我们还可以采取哪些其他步骤来诊断问题?

解决方法

问题是该应用程序实际上正在运行32位模式,因此受到内存限制。

有趣的是,任务管理器向我们撒谎,并说该进程以64位模式运行。但是使用this method检查DLL时发现它实际上是在32位上运行。

该应用程序被设置为可与“任何CPU”一起运行,并且已在64位计算机上编译并运行。但是我们认为,由于引用了一个古老的软件包csharp-argon2,它已恢复为32位。如该软件包的项目站点上所述,指定x64可以明显解决该问题。