我们有一个Web应用程序,可用作反向代理(转发请求和响应)。这是一个更大的平台的一部分,因此有相当多的电话通过那里。该应用程序在IIS上运行,我们使用ASP.NET WebApis ApiController接收和HttpClient重新发送调用(.NET 4.6.1上的新的NuGet包)。我们已禁用IIS工作进程回收。
在生产中我们可以看到,大约一周内存使用量不断增长,然后保持在较高水平。偶尔我们会得到OutOfMemoryExceptions。使用R#dotMemory profiler我们找不到内存泄漏,但我们可以看到Gen 0到2对象存在巨大的碎片(高达99%!)。我们假设这与dotMemory标记为固定的OverlappedData对象有关。
有一些帖子处理这类问题,一个好的问题是http://www.ahuwanya.net/blog/post/Buffer-Pooling-for-NET-Socket-Operations - 摘要是碎片与IO操作的缓冲区固定有关。所以在这个基础上我们有一些问题:
当然,任何其他建议,提示或评论都可以帮助我们缩小范围并解决问题。请注意,我们希望解决此问题,但没有针对它的解决方法(例如每天重新启动IIS工作进程)。
答案 0 :(得分:0)
在当前版本中,我们不再存在此问题。我们对此没有真正的解释-似乎唯一改变的是我们删除了一些“易失”定义。这可能是原因吗?也许是的-实际上我们假设是这样,但没有真正的证据。根据文档,尚不清楚volatile是否会阻止内存优化,但有可能了解这一点。所以我们就这样接受它...