0

在使用静态 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 也将被重复使用,并且这些集合将继续增长。

4

1 回答 1

0

有一个导致此问题的 CookieContainer 错误:https ://github.com/dotnet/corefx/issues/33712

于 2018-11-29T17:40:08.673 回答