在使用静态HttpClient定期点击返回set-cookie标头的不同URL的应用程序中,我看到少量内存泄漏以及CPU使用率随着时间的推移逐渐增加。通过在HttpClientHandler上设置UseCookies = false可以解决这些问题。这促使我调查CookieContainer,发现它维护域的哈希表(m_domaintable),并且对于每个域,它维护路径的排序列表(m_list)。因此,即使根据Capacity和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也将被重用,并且这些集合将继续增长。