#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 и т.д., И все это может отнять у вас много времени.
Удачи!