最佳答案
当我并行运行大约 20 个 Selenium 测试时,我遇到了同样的问题。在分析了这个问题之后,我缩小了它的范围,这可能是由于一个特定的方法分配了大量内存,而 GC 可能没有及时清理它以进行并行调用,所以正如问题下的讨论所建议的那样,我想它创造了一个瑞士奶酪.
我首先添加了这段代码来按照此处的建议分析这个问题 https://www.codeguru.com/dotnet/memory-leaks-dot-net/
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
果然分配给 .Net 的未使用内存从 500MB 减少到 50MB
但是这段代码是不可取的,因为它会导致死锁,所以我的解决方案是在方法的开头获取分配的字节,然后在结束时提醒 GC 关于该方法调用期间分配的字节。结果我看到内存消耗慢慢减少到 50MB
public async Task<IActionResult> MemoryConsumingMethod()
{
var allocatedBytesStart = GC.GetTotalAllocatedBytes();
...
//main content
var model = MyViewModel(){...}
...
var allocatedBytesEnd = GC.GetTotalAllocatedBytes();
GC.AddMemoryPressure(allocatedBytesEnd - allocatedBytesStart);
return View(model);
}
关于memory-leaks - 我有很多未使用的内存分配给 .net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9026176/