Я пытался отследить (как представляется) утечку памяти в приложении ASP.NET Core, работающем в Azure. Я собрал DMP в начале приложения и DMP, когда память достигла своего пика прямо перед тем, как она остановилась и рухнула. Я пытаюсь расшифровать файлы DMP, используя PerfView. Я загрузил первый дамп, затем второй и сделал diff. Вывод вкладки «По имени» выглядит следующим образом:
Итак, первый вопрос: я правильно понял? Это говорит мне о 18 501 экземпляре HttpClient? Если это так, святое дерьмо.
Я зашел на вкладку "RefTree", и вот что я вижу там:
Конечно же, HttpClient, который, кажется, берет большую часть, взят из LGAuthLib, которая является моей библиотекой.
Итак, что я не понимаю, так это то, что HttpClient является статическим объектом, размещаемым один раз в статическом конструкторе в этой библиотеке классов, а затем используемым везде. Как можно выделить 18 000 из них? Могут ли существовать 18 000 библиотек классов, в которых находится статический объект? Я не знаю, как это возможно, поскольку этот объект размещен в синглтоне DI.
Вот почему я не уверен на 100%, что правильно читаю этот Diff. Я просто не могу понять, как это могло протекать.
Для профессионалов, которые смотрели на эти вещи, вы на 100% уверены, что объект HttpClient протекает?
Для полноты картины, вот как я использую объект HttpClient:
public async Task<string[]> GetRolesForUserByUserNameAsync(string strUser)
{
var reqParams = new HttpRequestMessage(HttpMethod.Post, new UriBuilder(_config.ServerUri)
{
Path = EndpointGetRolesForUserByMicroService
}.Uri);
reqParams.Headers.Add("MicroService", CreateMicroServiceHeaderValue(EndpointGetRolesForUserByMicroService));
reqParams.Content = HttpClientExtensions.JsonContent(new { userName = strUser });
using (var resp = await _httpClient.SendAsync(reqParams).ConfigureAwait(false))
{
resp.EnsureSuccessStatusCode();
return (await resp.Content.ReadAsJsonAsync<string>().ConfigureAwait(false)).Split(',');
}
}
Вот как это распределяется:
public sealed class AuthService
{
private static readonly HttpClient _httpClient;
static AuthService()
{
_httpClient = new HttpClient();
}
}