У меня действительно были проблемы с памятью в приложении ASP.NET. Кажется, что каждый раз, когда страница загружается, старый предыдущий экземпляр страницы не удаляется из памяти. Если вы нажмете F5 десять раз, память добавит 10-20 МБ к экземпляру. Во время стресс-тестирования и тестирования производительности это приведет к максимальному использованию памяти, и веб-сервер будет зависать ...
Я запустил профилирование памяти ANTS, и он подтвердил, что при каждой загрузке страницы старый экземпляр остается в памяти. Все мои веб-страницы ASP.NET также используют главную страницу. Опять же, если я загружаю страницу 10 раз, то существует 10 экземпляров веб-страницы, а также 10 экземпляров главной страницы ...
http://oi51.tinypic.com/21msy2g.jpg
Глядя на результаты профилировщика муравьев, вы можете видеть, что каждая перезагрузка страницы добавляет около 320 КБ в память, и это просто веб-страница, даже не принимая во внимание главную страницу. Мое приложение представляет собой приложение для страхования жизни, которое фиксирует приложения, поэтому оно просматривает около 30-40 страниц. Таким образом, вы можете понять, почему это серьезная проблема.
Как мне узнать, что хранит страницу в памяти? Я понятия не имею, с чего начать ...: \
Все мои страницы используют инъекцию Unity и Dependency для регистрации службы ... Не уверен, что мне нужно отменить регистрацию этих служб после выполнения page_onUnload.
EDIT
Хорошо, мне удалось отследить проблему. Причина, по которой страница не удаляется (GCollected), заключается в том, что экземпляры службы Unity, зарегистрированные, но незарегистрированные во время выгрузки страницы. Вот как я использую Unity на своей странице:
Я внедряю услуги через общедоступные объекты
#region Services
[Dependency]
public ReviewReportService SummaryService { get; set; }
[Dependency]
public Portfolios.PortfolioService PortfolioService { get; set; }
#endregion
Затем, страница инициализации, я делаю наращивание Unity:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
ApplicationContainer.BuildUp(this.Context, this);
}
Теперь, очевидно, когда страница проходит свой обычный жизненный цикл и вызывает Unload, она не может выгружаться из-за ссылки на внедрение зависимостей ... Я просто не знаю, как отменить регистрацию сервисов (SummaryService, PortfolioService)
Я попытался вызвать следующее в OnUnload, но оно ничего не делает:
ApplicationContainer.GetContainer (Context) .Teardown (это);