Я работаю над сайтом администратора, созданным с использованием ASP.NET 4.5 (C#/WebForms) поверх хранилища данных SQL Server, что требует от меня загрузки больших наборов записей (250K + записей). В разработке на IIS Express я последовательно получаю исключения Out Of Memory (OOM), происходящие из IIS. Я могу посмотреть диспетчер задач и посмотреть, как использование памяти увеличивается с 120 000 К до более 600 000 К.Очистка памяти в IIS после выполнения больших запросов
Проблема (ПРОЧАЯ проблема) Я столкнулся с тем, что, когда я возвращаюсь и фильтрую запрос, чтобы он не возвращал столько записей, я продолжаю получать исключения OOM, потому что IIS не освобождает память от предыдущей запрос. Память, необходимая для нового запроса, просто сваливается поверх уже выделенной памяти.
На полной установке IIS 7 (до сих пор на моем DEV поле) я не получаю начальное исключение ООГО из IIS, однако это еще не отпуская память, которая будет продолжать создавать проблемы для будущей деятельности IIS как память продолжает накапливаться. Я понимаю, что GC должен в конце концов уйти, чтобы очистить его, но мне нужно, чтобы это произошло немедленно.
Итак, вопрос в том, как я могу освободить неиспользуемую, но выделенную память от IIS по запросу?
я нашел следующие статьи SF ...
который привел меня попробовать следующее ...
protected override void OnPreRender(EventArgs e)
{
try
{
var data = this.GetSessionList();
BindUI(data);
}
catch (Exception ex)
{
//
// display error message
while (ex.InnerException != null) { ex = ex.InnerException; }
String msg = (ex.GetType() == typeof(OutOfMemoryException)) ? MessagesConfigService.OutOfMemory.SessionReports : ex.Message;
ucAlert.ShowMessage(msg, ucAlertMessage.AlertStates.DANGER);
}
finally
{
//
// Clean up anything being held on to in memory. This will not prevent OOM
// exceptions for too-large queries, but will prevent further OOM errors for
// smaller queries that follow.
GC.Collect();
Int64 totalMemory = GC.GetTotalMemory(true);
}
base.OnPreRender(e);
}
В наконец статья Я пробовал каждый из методов GC самостоятельно, а также вместе, но не видел уменьшения памяти, хранящейся в IIS.
Другая вещь, о которой я изначально не думал, но поскольку я набираю это, осознаю, важно ... Мне нужно очистить память, но сохранить состояние сеанса ... так что независимо от решения, оно не должно быть уничтожено состояние сеанса, что приведет к необходимости повторного входа пользователя.
Итак ... любые мысли?
Спасибо заранее :)
-G
P.S. Причина таких больших наборов записей заключается в том, что бизнес хочет иметь возможность экспортировать данные в электронную таблицу Excel, поэтому простое разбиение на страницы результатов необязательно является опцией. Кроме того, существует достаточное количество задержек, так как запрос выполняется, поэтому необходимость выдерживать время выполнения для каждой страницы будет непомерно высокой. У меня есть вопросы о производительности, настраивающей этот запрос, но, очевидно, выходит за рамки этого вопроса.
Вы можете прочитать этот пост. http://stackoverflow.com/questions/9666356/high-memory-usage-with-w3wp-application-pool-iis-7 –
Память будет выпущена, если ссылок не останется. Это предполагает ошибку или недоразумение. Кроме того, OOM не происходит из IIS. Он исходит из CLR, когда вы исчерпали доступную память. Опубликуйте больше кода и переключитесь на 64 бит. – usr