Страницы ASP.NET не удаляются из памяти - PullRequest
5 голосов
/ 26 августа 2011

У меня действительно были проблемы с памятью в приложении 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 (это);

Ответы [ 4 ]

1 голос
/ 26 августа 2011

У вас есть статическая ссылка на страницу где-то, и она не может быть удалена.

0 голосов
/ 16 сентября 2011

Проблема была вызвана UNITY и LifeTimeManager. Мне пришлось использовать другое единство LifeTimeManager, которое в основном возвращает новый контейнер каждый раз, когда страница накапливается. При UnLoad страницы вызывается разрыв содержимого контейнера, который удаляет все ссылки на внедренные свойства. Это решило мою проблему:)

0 голосов
/ 26 августа 2011

Я бы проверил, существует ли статическая коллекция где-нибудь на странице / главной странице. Просто выполните поиск слова static (C #) или shared (VB) во всем проекте

0 голосов
/ 26 августа 2011

Я бы определенно начал с отмены регистрации услуг.Я видел большие утечки памяти из-за этой самой проблемы (хотя в этом случае не использовалось целое).

Кроме того, посмотрите вокруг и посмотрите, используете ли вы переменную страницы так, чтобы она не была мусором.собраны.

...