【发布时间】:2019-04-24 12:08:03
【问题描述】:
在使用静态 HttpClient 定期访问返回 set-cookie 标头的不同 url 的应用程序中,我发现内存泄漏以及 CPU 使用率逐渐增加。这些问题可以通过在 HttpClientHandler 上设置 UseCookies = false 来解决。这导致我调查 CookieContainer,我发现它维护一个域的哈希表 (m_domaintable),并且对于每个域,它维护一个排序的路径列表 (m_list)。因此,即使根据容量和 PerDomainCapacity 正确删除了 cookie,内存和 CPU 使用量也会随着时间的推移而增长,因为这些集合会随着每个新域/路径的命中而增长。下面有一些显示内存泄漏的示例。
第一个例子:为许多不同的域添加一个 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 应该在应用程序的整个生命周期中重复使用,但这意味着 CookieContainer 也将被重复使用,并且这些集合将继续增长。
【问题讨论】:
标签: c# .net dotnet-httpclient system.net cookiecontainer