System.OutOfMemoryException в Windows Server 2008 R2 + ASP.NET 3.5 - PullRequest
0 голосов
/ 10 января 2011

Сегодня рабочий сервер на моей работе начал получать это исключение OutOfMemoryException, но, насколько я знаю, на сайте не было обновлений кода.

Я вставил трассировку стека ниже, но есть идеи о том, что может происходить? По сути, этот элемент управления заголовком загружает части веб-сайта с удаленного сервера и включает его как часть HTML.

Ошибка сервера в «/» приложении. Исключение типа 'System.OutOfMemoryException' было сгенерировано. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Exception Details: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.

Source Error:

Line 58:         else
Line 59:         {
Line 60:             thisHeader = Cache[headerCacheKey].ToString() + "\n<!-- pulled from cache -->\n";
Line 61:         }
Line 62:         if (!String.IsNullOrEmpty(thisHeader))


Source File: ...

Stack Trace:

[OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.]
   System.String.Concat(String str0, String str1) +66
   ASP.controls_header_ascx.Page_Load(Object sender, EventArgs e) in ...:60
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +42
   System.Web.UI.Control.OnLoad(EventArgs e) +132
   System.Web.UI.Control.LoadRecursive() +66
   System.Web.UI.Control.LoadRecursive() +191
   System.Web.UI.Control.LoadRecursive() +191
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428

Ответы [ 2 ]

4 голосов
/ 10 января 2011

Строка, на которую указывает вам среда выполнения (Line 60, я полагаю), не обязательно является причиной System.OutOfMemoryException. Может быть какой-то код, который наполняет веб-кеш большим количеством информации и не раскрывает эту информацию, когда она больше не является «действительной» или «актуальной».

В любом случае, я предлагаю вам сначала прочитать эти две статьи:

  1. Устранение неполадок System.OutOfMemoryException
  2. Отслеживание управляемых утечек памяти (windbg)

Вторая статья мне очень помогла, когда я однажды столкнулся с той же проблемой. Сейчас я предпочитаю windbg другим (часто проприетарным) программам, чтобы выяснить, где в программном обеспечении происходит утечка памяти.

Вы также можете попробовать использовать один из этих очень полезных инструментов, чтобы выяснить, что вызывает утечки памяти:

  1. dotTrace Memory profiler
  2. ANTS Профилировщик памяти

В общем, я думаю, что хорошей практикой является проверка процесса выполнения программного обеспечения с использованием профилировщика памяти перед развертыванием программного обеспечения в производственной среде.

3 голосов
/ 10 января 2011

Зацикливаетесь ли вы в Page_Load и в этом цикле, конкатенируя строку? Конкатенация строк ОЧЕНЬ медленная, и при каждой конкатенации новый строковый объект выделяется и помещается в кучу. System.Text.StringBuilder - гораздо более эффективный способ выполнения операций такого рода. Примечание: если объединяются только несколько коротких строк, это не проблема, но если вы считаете, что это выйдет за рамки этого, то StringBuilder - ваш друг.

НТН

...