CookieContainer内存泄漏
CookieContainer memory leak
在使用静态 HttpClient 定期访问 return set-cookie headers。这些问题通过在 HttpClientHandler 上设置 UseCookies = false 来解决。这促使我调查 CookieContainer,我发现它维护了一个域哈希表 (m_domaintable),并且为每个域维护了一个排序的路径列表 (m_list)。因此,即使根据 Capacity 和 PerDomainCapacity 正确删除了 cookie,内存和 cpu 使用会随着时间的推移而增长,因为这些 collections 随着每个新的 domain/path 被命中而增长。下面有一些示例显示内存泄漏。
第一个示例:为许多不同的域添加 cookie
var cookieContainer = new CookieContainer();
for (int i = 0; i < 10000; i++)
{
cookieContainer.Add(new Cookie("name1", "value1", "/", $"test{i}.com"));
}
第二个示例:为具有不同路径的同一域添加 cookie
var cookieContainer = new CookieContainer();
for (int i = 0; i < 10000; i++)
{
cookieContainer.Add(new Cookie("name1", "value1", $"/{i}", "test.com"));
}
我在使用 HttpClient/HttpClientHandler/CookieContainer 时是否遗漏了什么?文档指出 HttpClient 应该 re-used 在应用程序的整个生命周期中,但这意味着 CookieContainer 也将 re-used 并且这些 collections 将继续增长。
存在导致此问题的 CookieContainer 错误:https://github.com/dotnet/corefx/issues/33712
在使用静态 HttpClient 定期访问 return set-cookie headers。这些问题通过在 HttpClientHandler 上设置 UseCookies = false 来解决。这促使我调查 CookieContainer,我发现它维护了一个域哈希表 (m_domaintable),并且为每个域维护了一个排序的路径列表 (m_list)。因此,即使根据 Capacity 和 PerDomainCapacity 正确删除了 cookie,内存和 cpu 使用会随着时间的推移而增长,因为这些 collections 随着每个新的 domain/path 被命中而增长。下面有一些示例显示内存泄漏。
第一个示例:为许多不同的域添加 cookie
var cookieContainer = new CookieContainer();
for (int i = 0; i < 10000; i++)
{
cookieContainer.Add(new Cookie("name1", "value1", "/", $"test{i}.com"));
}
第二个示例:为具有不同路径的同一域添加 cookie
var cookieContainer = new CookieContainer();
for (int i = 0; i < 10000; i++)
{
cookieContainer.Add(new Cookie("name1", "value1", $"/{i}", "test.com"));
}
我在使用 HttpClient/HttpClientHandler/CookieContainer 时是否遗漏了什么?文档指出 HttpClient 应该 re-used 在应用程序的整个生命周期中,但这意味着 CookieContainer 也将 re-used 并且这些 collections 将继续增长。
存在导致此问题的 CookieContainer 错误:https://github.com/dotnet/corefx/issues/33712