powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / AspCore течет память при интенсивном парсинге Json-документов
37 сообщений из 37, показаны все 2 страниц
AspCore течет память при интенсивном парсинге Json-документов
    #40048500
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, столкнулся с проблемой, когда потребление памяти имеет ненормальный характер.
Суть работы приложения-обращение к стороннему API, получения от него JSON и его парсинг.
В упрошенной схеме это выглядит так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
   private async  IAsyncEnumerable<(string docID,string ki)> SaveToLocalDataOutputDocsAsync()
   { 
      var сlient = _httpClientFactory.CreateClient("client");
	await foreach (var doc in GetDocsNumberAsync())
	{
	  using var docStream = await gisMtClient.GetStreamAsync($"getDoc/{doc}");
	  using JsonDocument jDocument = await JsonDocument.ParseAsync(docStream);
			  
	  ///заглушка, память забивается и без парсинга документа
	  yield return ("docID", "value");
        }
    }
    
   ///Получаем id документов
   private async IAsyncEnumerable<string> GetDocsNumberAsync()
    {
        var client = _httpClientFactory.CreateClient("client");
        using var docStream = await client.GetStreamAsync("url");

        using JsonDocument jDocument = await JsonDocument.ParseAsync(docStream);
        var root = jDocument.RootElement.GetProperty("results").EnumerateArray();

        foreach (var item in root)           
          yield return item.GetProperty("number").GetString();
    }



Json-документы тяжелые- могут быть и по 4 Мб.
Проблема: постепенное увеличение потребления оперативной памяти и периодическим скачкобразными "взрывами". GC не уменьшает значительно потребление памяти, пару десятков мегабайт освободит и все.
На графике видно, что сначала происходит линейный рост потребления памяти с небольшим увеличением в динамике, потом когда потребление памяти становится 150 мб происходит резкий скачек до 308 мб.
Причем и при 150мб и при 308 обрабатывается документ одного и того же размера (json около 2мб). Я произвел профилирование потребление памяти, которое показало, что наибольшим потребителем является
"TlsOverPerCoreLockedStacksArrayPool+LockedStack<Byte>" и "JsonDocument". Мне не понятно, почему память течет, ведь все закрыто using и она должна освобождаться или по крайней мере расти не такими семимильными темпами.
Спасибо
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40048501
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40048502
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40048508
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя из-за "yield" итерация отложенная. Вся хурда что только можно висит в памяти пока последовательность не будет перебрана целиком - возможно дело в этом.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40048525
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Код: c#
1.
 using JsonDocument jDocument = await JsonDocument.ParseAsync(docStream);



Не надо парсить в JsonDocument, а сразу через JsonReader. В XML-е это называется SAX парсинг.

Не нужен вам объект документа, лишний он тут и память жрёт.
Постарайтесь обойтись без yield, можете переиспользовать коллекции или буферы.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40048592
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
vb_sub
Код: c#
1.
 using JsonDocument jDocument = await JsonDocument.ParseAsync(docStream);



Не надо парсить в JsonDocument, а сразу через JsonReader. В XML-е это называется SAX парсинг.

Не нужен вам объект документа, лишний он тут и память жрёт.
Постарайтесь обойтись без yield, можете переиспользовать коллекции или буферы.


Ближайший родственник JsonReader из System.Text.Json это Utf8JsonReader, но он не поддерживает использование в асинхронных методах, то есть от самой точки входа в метод придется все делать синхронно. Это было бы терпимо, но оказывается HttpClient не имеет синхронных методов и нужно костылить ожидание асинхронной операции в синхронном коде.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40048624
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Ближайший родственник JsonReader из System.Text.Json это Utf8JsonReader, но он не поддерживает использование в асинхронных методах, то есть от самой точки входа в метод придется все делать синхронно. Это было бы терпимо, но оказывается HttpClient не имеет синхронных методов и нужно костылить ожидание асинхронной операции в синхронном коде.


Ну у вас не десятки и не сотни мб объём JSON, не нужна вам асинхронность в парсинге. Просто исключите лишнее давление на память и GC.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049029
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После последовательного исключения кода, который мог бы повлиять на рост потребления оперативной памяти, я остановился на том что память уходит из-за метода отправки http-запроса. В частности я сделал тестовый метод, чтобы проверить мои подозрения. Я попробовал осуществить приведенные здесь советы- заменить yield, заменил JsonDocument на Utf8JsonReader, пробовал делать все синхронным- ничего не помогло.
22286181 объем суммарно может доходить и до 100 мб(множество запросов, где в каждом ответе приходит около 4 мб)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public void ConfigureServices(IServiceCollection services)
        {
            services.AddHttpClient("fakeApiClient",c=> 
            {   
                c.BaseAddress = new Uri("https://jsonplaceholder.typicode.com/");
                c.DefaultRequestHeaders.Add("Accept", "application/json");
            });
        }

public async Task TestProcessAsync()
{
    for (int i = 0; i < 500; i++)
         {
            var client = _httpClientFactory.CreateClient("fakeApiClient");
            var req = await client.GetByteArrayAsync("comments");
            Console.WriteLine($"RequestNumber:{i}");
         }
}



График потребления противоречивый- потребление памяти сначала росло где-то до 140, стабилизируется и остается на одном уровне, потом где-то на 300 запросе происходит вызов сборщика мусора, который очищает 2-е поколение и после этого скачкообразный рост потребления до 300 мб.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049088
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну у вас не десятки и не сотни мб объём JSON, не нужна вам асинхронность в парсинге.

В парсинге там асинхронности скорее всего и нет - асинхронность в чтении стрима, который парсят.

ТС, ты не пробовал готовые JSON-расширения для HTTP? (System.Net.Http.Json)
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049129
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если у тебя блок памяти в 4мб и постоянно ...gc все что выше 85000 байт кидаешь в loh и утилизацию не будет вызывать пока gen0 может выделить память.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049130
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, как так-то? Ты же писал что там с помощью структур и GetHashCode все оптимизировано по самое нехочу
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049172
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,
Пробовал получать небольшие JSON-документы, чтобы ни гарантированно в LOH не попали- все равно ситуация идентичная.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049173
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ну у вас не десятки и не сотни мб объём JSON, не нужна вам асинхронность в парсинге.

В парсинге там асинхронности скорее всего и нет - асинхронность в чтении стрима, который парсят.

ТС, ты не пробовал готовые JSON-расширения для HTTP? (System.Net.Http.Json)


В листинге
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public async Task TestProcessAsync()
{
    for (int i = 0; i < 500; i++)
         {
            var client = _httpClientFactory.CreateClient("fakeApiClient");
            var req = await client.GetByteArrayAsync("comments");
            Console.WriteLine($"RequestNumber:{i}");
         }
}


не доходит до этапа парсинга, а память уже течет.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049176
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал сделать в консольном приложении все нормально.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
static async Task Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();
            Configure(serviceCollection);
            var services = serviceCollection.BuildServiceProvider();

            var _httpClientFactory = services.GetRequiredService<IHttpClientFactory>();

            for (int i = 0; i < 500; i++)
            {
                var client = _httpClientFactory.CreateClient("fakeApiClient");
                var req = await client.GetByteArrayAsync("comments");
                Console.WriteLine($"RequestNumber:{i}");
            }
        }

        public static void Configure(IServiceCollection services)
        {
            services.AddHttpClient("fakeApiClient", c =>
            {
                c.BaseAddress = new Uri("https://jsonplaceholder.typicode.com/");
                c.DefaultRequestHeaders.Add("Accept", "application/json");
            });
        }
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049199
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Попробовал сделать в консольном приложении все нормально.

Становится все загадочней. Сделай в своем webapi какой-нибудь action в котором вообще ничего, а только код из этого консольного приложения. Только, понятно, ServiceCollection и проч. руками не создавай - просто заинжекть HttpClientFactory через ctor контроллера.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049278
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt, как так-то? Ты же писал что там с помощью структур и GetHashCode все оптимизировано по самое нехочу


Ну ты сравнение-то посмотри с другими парсерами. По самое нехочу да.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049281
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,

Проведи нагрузочное тестирование, найти корни, которые не убиваются GC.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049292
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну ты сравнение-то посмотри с другими парсерами. По самое нехочу да.

Да я прикалываюсь просто. Я знаю, что он шустрый. К тому же, как выясняется, вроде бы, дело совсем не в JSON. Сдается мне, автор тут что-то нам недопоказывает.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049293
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[HttpGet("")]
public async Task Get()
{
    for (var i = 0; i < 100000; i++)
    {
        using var httpClient = _httpClientFactory.CreateClient();
        var bytes = await httpClient.GetByteArrayAsync("photos");
    }
}


Вот такая картинка:



С виду все ровно - мусорщик регулярно вызывается, расход памяти не растет.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049297
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
С виду все ровно - мусорщик регулярно вызывается, расход памяти не растет.


Ты хоть using добавил ))

fkthat
Сдается мне, автор тут что-то нам недопоказывает.


Да фиг бы с ним, не понял проблемы. Ну используется память, как бы и что )
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049306
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ты хоть using добавил ))

Да он на самом деле ни на что не влияет. Даже в доках есть, что HttpClient вообще можно использовать как singleton без всякого Dispose. И даже не можно, а нужно (если не используется IHttpClientFactory). Using тут так, чисто по привычке.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049336
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ты хоть using добавил ))

Да он на самом деле ни на что не влияет. Даже в доках есть, что HttpClient вообще можно использовать как singleton без всякого Dispose. И даже не можно, а нужно (если не используется IHttpClientFactory). Using тут так, чисто по привычке.

Using здесь определенно не нужен пруф . Используя его Вы нивелируете те возможности IHttpClientFactory, борящиеся c проблемами, которые порождает создание каждый раз нового HttpClient(socket exhaustion, httpclientPooling, dns caching).
22287430
У Вас потребление устаканилось на уровне 261 МБ при 100_000 запросах, однако Вас не на настрожило то, что приложение стартует с потреблением 90 МБ осуществляет операции с http-запросами, полностью их выполняет, и потребление памяти после этого не падает, хотя все ресурсы, затраченные на эти операции должны быть вычищены сборщиком мусора.
К сожалению на графике не видно есть ли резкий скачек потребления памяти, подозреваю что скорее всего да, хотя по логике процесса память должна расти линейно.
Причем эмпирически я выяснил что появление этого скачка зависит от количества итераций- на примере "https://jsonplaceholder.typicode.com/"
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  [HttpGet("")]
        public async Task Get()
        {
            for (int i = 0; i < 120; i++)
            {
                var client = _httpClientFactory.CreateClient("fakeApiClient");
                var bytes = await client.GetByteArrayAsync("comments");
                Console.WriteLine($"RequestNumber:{i}");
            }
        }


конечное потребление памяти-114МБ -потребление растет линейно, скачков нет
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  [HttpGet("")]
        public async Task Get()
        {
            for (int i = 0; i < 150; i++)
            {
                var client = _httpClientFactory.CreateClient("fakeApiClient");
                var bytes = await client.GetByteArrayAsync("comments");
                Console.WriteLine($"RequestNumber:{i}");
            }
        }


Конечное потребление-264 МБ
Количество итераций увеличилось на 25%, потребление памяти увеличилось на 130%. Я бы мог это объяснить, если бы был какой-либо объект, который аккумулирует результат каждой итерации и он провалился в LOH, однако здесь после выхода из каждой итерации цикла не должно ничего остаться.
Это все результаты на чистом проекте, с одним контроллером и одним Action-остальные side-эффекты исключены.
22287429 =false; Весь код выставил, все договорил, ничего не скрываю.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049337
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
vb_sub,
Проведи нагрузочное тестирование, найти корни, которые не убиваются GC.

Штатного профилировщика памяти будет достаточно или нужны сторонние инструменты для поиска корней?
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049354
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Количество итераций увеличилось на 25%, потребление памяти увеличилось на 130%.

У меня абсолютно одинаковая картинка для 100, 200, и 1000 итераций, причем как с using так и без него.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[HttpGet("")]
public async Task Get([FromQuery] int iterationCount)
{
    for (var i = 0; i < iterationCount; i++)
    {
        var httpClient = _httpClientFactory.CreateClient();
        var bytes = await httpClient.GetByteArrayAsync("comments");
    }
}





Первый сборщик вызван при запросе 100 итераций, три вторых - для 200, последующие для 1000.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049356
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
такой же скачек есть.
Нашел решение форк можно закрыть.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
    for (int i = 0; i < 1000; i++)
            {
               using var response = await client.GetAsync("comments", HttpCompletionOption.ResponseHeadersRead);
                  using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync();
                    using JsonDocument jDocument = await JsonDocument.ParseAsync(streamToReadFrom);

                    Console.WriteLine($"RequestNumber:{i}");
            }


единственный минус- нельзя использовать для десериализации Utf8JsonReader.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049357
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
такой же скачек есть.

Это скачок при вообще самом первом вызове HTTP GET. То что до него - это просто запущеное приложение до каких бы то ни было запросов.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049363
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
при единичном и первом вызове HTTP GET отъедает около 3 мб в моем примере и скачка нет.
Код: c#
1.
2.
3.
4.
5.
6.
    [HttpGet("")]
        public async Task Get()
        {
            var client = _httpClientFactory.CreateClient("fakeApiClient");
            var req = await client.GetByteArrayAsync("comments");
        }
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049364
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049385
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub

Ну и где тут три мегабайта? Я вижу почти 80.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049392
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
перед запросом около 76, после выполнения-80. Я имел ввиду прирост потребления.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049393
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
fkthat,
перед запросом около 76, после выполнения-80. Я имел ввиду прирост потребления.

Ну так конечно - у тебя один запрос выполняется, а у меня 100.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049413
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
fkthat,
такой же скачек есть.
Нашел решение форк можно закрыть.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
    for (int i = 0; i < 1000; i++)
            {
               using var response = await client.GetAsync("comments", HttpCompletionOption.ResponseHeadersRead);
                  using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync();
                    using JsonDocument jDocument = await JsonDocument.ParseAsync(streamToReadFrom);

                    Console.WriteLine($"RequestNumber:{i}");
            }


единственный минус- нельзя использовать для десериализации Utf8JsonReader.

ну так ты засчет HttpCompletionOption.ResponseHeadersRead и убираешь доп аллокацию давно известная история..просто ты начал с истории что объекты по 4мб вот и сходу я и сказал про Loh
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049448
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
vb_sub
fkthat,
перед запросом около 76, после выполнения-80. Я имел ввиду прирост потребления.

Ну так конечно - у тебя один запрос выполняется, а у меня 100.

Это в ответ на твое сообщение, что скачек памяти больше чем на 100 мб происходит при отправке первого запроса- как видишь нет.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049449
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
vb_sub
fkthat,
такой же скачек есть.
Нашел решение форк можно закрыть.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
    for (int i = 0; i < 1000; i++)
            {
               using var response = await client.GetAsync("comments", HttpCompletionOption.ResponseHeadersRead);
                  using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync();
                    using JsonDocument jDocument = await JsonDocument.ParseAsync(streamToReadFrom);

                    Console.WriteLine($"RequestNumber:{i}");
            }


единственный минус- нельзя использовать для десериализации Utf8JsonReader.

ну так ты засчет HttpCompletionOption.ResponseHeadersRead и убираешь доп аллокацию давно известная история..просто ты начал с истории что объекты по 4мб вот и сходу я и сказал про Loh

Я экспериментировал и с малыми объектами запроса, чтобы они сразу в LOH не попадали, однако в действительности происходит как будто аккумулятивный эффект, после определенного значения происходит скачек потребления памяти. В профайлере памяти этот объект назывался HttpContent, который рос в зависимости от количества запросов.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049473
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Вот такой код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[HttpGet("")]
public async Task Get()
{
    for (var i = 0; i < 100000; i++)
    {
        using var httpClient = _httpClientFactory.CreateClient();
        var bytes = await httpClient.GetByteArrayAsync("photos");
    }
}


Вот такая картинка:

С виду все ровно - мусорщик регулярно вызывается, расход памяти не растет.

Очень странно здесь ты используешь using для HttpClient, а годом раньше говорил, что нельзя так делать fkthat asp.net core 3.1 HttpClient Error while copying content to a stream.
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049514
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
что нельзя так делать

Нет, я там имел в виду вовсен не using. Его использовать можно, хоть он ни на что и не влияет. Нельзя на каждый вызов создавать HttpClient (кроме случая, когда для его создания используется HttpClientFactory). Суть там в том, что сам по себе HttpClient мало что делает, а является оберткой поверх HttpClientHandler. Если на каждый вызов создается новый HttpClient (через new), то для него создается и новый HttpClientHandler, что, собственно, и приводит к неприятным последствиям. Если же для создания используется HttpClientFactory, то повторно используются HttpClientHandler из его пула и все нормально. Другой способ, как я выше сказал - это просто создать HttpClient один раз как singleton и использовать везде его, но он как-то смотрится не очень хорошо - с фабрикой все красивее и дает дополнительные возможности (например именованные HttpClient).
...
Рейтинг: 0 / 0
AspCore течет память при интенсивном парсинге Json-документов
    #40049540
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
HttpClient один раз как singleton и использовать везде его, но он как-то смотрится не очень хорошо - с фабрикой все красивее и дает дополнительные возможности (например именованные HttpClient)


Если планируется использовать в multiple threads, то не стоит использовать один экземпляр, хотя основные методы потокобезопасны, нельзя сказать это в отношении любых кастомных хендлеров.

Конечно же только IHttpClientFactory )
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / AspCore течет память при интенсивном парсинге Json-документов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]