Утечка памяти в CookieContainer

Я наблюдаю небольшую утечку памяти в сочетании с постепенным увеличением использования ЦП со временем в приложении, которое использует статический HttpClient для регулярного обращения к различным URL-адресам, которые возвращают заголовки set-cookie. Эти проблемы решаются путем установки UseCookies = false на HttpClientHandler. Это привело меня к исследованию CookieContainer, и я обнаружил, что он поддерживает хеш-таблицу (m_domaintable) доменов и для каждого домена он поддерживает отсортированный список путей (m_list). Таким образом, даже несмотря на то, что cookie-файлы корректно удаляются на основе Capacity и PerDomainCapacity, использование памяти и процессоров со временем увеличивается, так как эти коллекции растут с каждым новым попаданием в домен / путь. Ниже приведены некоторые примеры, которые показывают утечку памяти.

Первый пример: добавьте cookie для множества разных доменов

var cookieContainer = new CookieContainer();
for (int i = 0; i < 10000; i++)
{
    cookieContainer.Add(new Cookie("name1", "value1", "/", $"test{i}.com"));
}

Второй пример: добавить куки для одного домена с разными путями

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 также будет использоваться повторно, и эти коллекции будут продолжать расти.

1 ответ

Решение

Существует ошибка CookieContainer, которая вызывает эту проблему: https://github.com/dotnet/corefx/issues/33712

Другие вопросы по тегам