Исключение нехватки памяти

#c# #.net #crash

#c# #.net #сбой

Вопрос:

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

Какие шаги я должен выполнить, чтобы определить основную причину?

 [369][4/29/2011 18:32:15:343]-ERR -[ThreadId = 7916, UIFramework_ICEVisionPro_GUIExceptionHandler.LogException]-System.OutOfMemoryException: Out of memory.

   at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc)

   at System.Drawing.BufferedGraphicsContext.CreateBuffer(IntPtr src, Int32 offsetX, Int32 offsetY, Int32 width, Int32 height)

   at System.Drawing.BufferedGraphicsContext.AllocBuffer(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)

   at System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)

   at System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle)

   at System.Windows.Forms.Control.WmPaint(Messageamp; m)

   at System.Windows.Forms.Control.WndProc(Messageamp; m)

   at System.Windows.Forms.ScrollableControl.WndProc(Messageamp; m)

   at System.Windows.Forms.ContainerControl.WndProc(Messageamp; m)

   at System.Windows.Forms.UserControl.WndProc(Messageamp; m)

   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messageamp; m)

   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messageamp; m) 
  

Комментарии:

1. Вы создаете какой-либо Bitmap объект и обрабатываете то же самое? если это так, я полагаю, что для процесса недостаточно доступной памяти для выполнения того же самого

2. Вы удаляете все неуправляемые ресурсы?

3. @Maanu, в другом вопросе вы упомянули, что загружали 30 экранов при запуске. Почему бы не включить эту информацию снова? Это почти наверняка является причиной ошибки…

4. Забавное название: «Память вне исключения» 🙂 Разве это не должно быть «Исключением нехватки памяти»?

5. @ScruffyDuck по личному опыту, я был бы поражен, если бы нехватка памяти при использовании GDI действительно вызывала правильное исключение OutOfMemoryException. Некоторое время назад я довольно много работал с файлами больших изображений, и ни разу я не видел, чтобы сгенерирован ООМ, даже при попытке захватить 1 ГБ памяти для одного изображения. Отчеты об ошибках GDI в лучшем случае комедийны.

Ответ №1:

используйте приличный профилировщик памяти, чтобы помочь найти основную причину проблемы

Ответ №2:

Из приведенной выше трассировки я понимаю, что вы используете windows.forms. Утечки памяти в программах Windows forms могут быть вызваны тем, что они забывают отменить события подписки при закрытии формы (подписчики препятствуют удалению формы). Есть несколько статей и руководств, которые предполагают, что это довольно распространенная ошибка в программировании forms, поэтому, возможно, вы могли бы это проверить. Конечно, сказав это, это может не совсем соответствовать вашему случаю (нехватка памяти происходит при запуске программы).

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

Однако, если утечка происходит в неуправляемом коде (как у этого парня здесь), вам не поздоровится. Эта статья может помочь вам начать.

В целом, вам, возможно, предстоит много читать, пытаясь понять управление памятью в .net-приложениях, как работают поколения gc и т.д., И все это может отнять у вас много времени.

Удачи!