.net 内存充足时,跨不同应用程序池出现多个OutOfMemoryException
我正试图找出导致OutOfMemoryException的原因 以下是有关我们设置的事实:.net 内存充足时,跨不同应用程序池出现多个OutOfMemoryException,.net,out-of-memory,windows-server-2019,.net,Out Of Memory,Windows Server 2019,我正试图找出导致OutOfMemoryException的原因 以下是有关我们设置的事实: 我们在同一台Windows 2019服务器上运行大约70个.NET Framework 4.8 web应用程序,每个应用程序都位于各自的应用程序池中 应用程序以64位模式运行(在任务管理器中验证) 在这一天中,我们看到大量OutOfMemoryException在不同的应用程序中同时发生 OutOfMemoryException出现在代码的不同部分 总体内存使用率约为机器容量的85%,这是一台大型机器,
- 我们在同一台Windows 2019服务器上运行大约70个.NET Framework 4.8 web应用程序,每个应用程序都位于各自的应用程序池中
- 应用程序以64位模式运行(在任务管理器中验证)
- 在这一天中,我们看到大量OutOfMemoryException在不同的应用程序中同时发生
- OutOfMemoryException出现在代码的不同部分
- 总体内存使用率约为机器容量的85%,这是一台大型机器,即可用内存约为30-40G。这台机器在一天中的使用量通常都在这个水平上(我想这是意料之中的)
- 遇到错误的应用程序正在使用3到6GB的RAM
- 分页文件设置为自动管理
- 未设置应用程序池的专用内存和虚拟内存限制(根据IIS中的设置,它们设置为0)
- 我们进行了内存转储并分析了DotMemory中的使用情况,但没有看到任何特别意外的情况
问题可能是什么?我们还可以采取哪些其他步骤来诊断问题?问题是应用程序实际运行的是32位模式,因此内存有限 有趣的是,TaskManager欺骗了我们,说这个进程是在64位模式下运行的。但是使用检查DLL显示它实际上是以32位运行的
应用程序被设置为使用“任意CPU”运行,并在64位机器上编译和运行。但我们认为它恢复到32位是因为引用了一个名为。正如在该包的项目站点上所解释的,指定x64明确地解决了这个问题。大于~80K的对象被分配到大对象堆(LOH)中,并且在GC期间不会对该堆进行碎片整理。如果一个应用程序运行大量短生命的大对象,LOH可能会被分割得太多,以至于没有足够的连续空间来分配对象。如果使用dotMemory,则会有一个关于所需视图的帮助主题。谢谢Ed.ward,这个解释确实有道理,但我认为这不是我们的问题所在。