固定内存导致C#WebApi中的碎片

固定内存导致C#WebApi中的碎片,c#,memory-management,asp.net-web-api2,C#,Memory Management,Asp.net Web Api2,我们有一个web应用程序作为反向代理(转发请求和响应)。这是一个更大平台的一部分,因此有相当多的电话通过该平台。该应用程序在IIS上运行,我们使用ASP.NET WebAPI ApiController接收和HttpClient重新发送调用(在.NET 4.6.1上更新的NuGet软件包)。我们已禁用IIS工作进程回收 在生产过程中,我们可以看到,在大约一周的时间里,内存使用量不断增长,然后保持在较高水平。偶尔我们会从内存异常中解脱出来。使用R#dotMemory profiler,我们无法找到

我们有一个web应用程序作为反向代理(转发请求和响应)。这是一个更大平台的一部分,因此有相当多的电话通过该平台。该应用程序在IIS上运行,我们使用ASP.NET WebAPI ApiController接收和HttpClient重新发送调用(在.NET 4.6.1上更新的NuGet软件包)。我们已禁用IIS工作进程回收

在生产过程中,我们可以看到,在大约一周的时间里,内存使用量不断增长,然后保持在较高水平。偶尔我们会从内存异常中解脱出来。使用R#dotMemory profiler,我们无法找到内存泄漏,但我们可以看到第0代到第2代对象存在巨大的碎片(高达99%!)。我们假设这与dotMemory标记为固定的重叠数据对象有关

有一些帖子讨论了这类问题,一个很好的帖子是——总结是碎片与IO操作的缓冲区固定有关。因此,我们有一些问题:

  • 我们如何引入一个缓冲池,如文章中所示,并使用套接字与ApicController和HttpClient一起使用
  • 我们如何才能强制释放固定内存,例如关闭连接,而不会造成显著的性能损失
  • 我们如何通过获取有关固定内存的更详细信息来确保假设是正确的?我们发现了一些关于使用Perfmon记录stacktraces的信息,但如果您能提供更详细的指南,我们将不胜感激

  • 当然,任何有助于我们缩小范围并解决问题的其他建议、提示或评论也将受到赞赏。请注意,我们希望解决此问题,但没有解决方法(例如每天重新启动IIS工作进程)。

    在当前版本中,我们不再存在此问题。我们对此没有真正的解释——唯一似乎已经改变的是,我们删除了一些“不稳定”的定义。这可能是原因吗?也许是的——事实上我们假设是这样,但没有确凿的证据。根据文档,目前还不清楚volatile是否会阻止内存优化,但无法理解这一点。所以我们就这样接受它…

    使用静态HttpClient看看你为什么要首先锁定?@Tony:我们已经使用了静态HttpClient。@Amy:正如对Tony说的,我们已经使用了静态HttpClient。因此,此解决方案不适用。