C # OutOfMemoryException - Как отследить преступника - PullRequest
3 голосов
/ 17 февраля 2011

У меня есть приложение C # / WPF, которое предназначено для запуска на небольшом ПК с 512 МБ памяти.Если его оставить для запуска, в конечном итоге генерируется исключение OutOfMemoryException.Это может занять от 12 часов до 2 дней.

Используя как ProcessExplorer, так и .NET Memory Profiler, я не вижу доказательств того, что память, используемая моим приложением, со временем увеличивается.Существует просто типичная схема небольшого роста, за которой следует сборка мусора.

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

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

Top Level Exception - System.OutOfMemoryException: Insufficient memory to continue the execution of the program.
    at System.Windows.Media.Composition.DUCE+Channel.SendCommand(Byte* pCommandData, Int32 cSize)
    at System.Windows.Media.MediaContext.EnterInterlockedPresentation()
    at System.Windows.Media.MediaContext.ScheduleNextRenderOp(TimeSpan minimumDelay)
    at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
    at System.Windows.Media.MediaContext.AnimatedRenderMessageHandler(Object resizedCompositionTarget)
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)

Любое понимание приветствуется!

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Оказывается, из-за различных проблем мое приложение зависало.Я подробно изложил их в другом посте здесь .

1 голос
/ 17 февраля 2011

Поскольку вы «маленький ПК», возможно, вы звоните не-.Net-коду для управления некоторым оборудованием. Возможно, эта часть программы использует достаточно много памяти (но все равно не пропускает). Чтобы заставить сборщик мусора работать больше в этом случае, посмотрите на добавление вызова GC.AddMemoryPressure ().

0 голосов
/ 30 июля 2015

Я наткнулся на очень хорошую статью, в которой подробно анализируется ошибка.

Ошибки потоков рендеринга WPF

Самый показательный парагаф: не пытайтесьпроанализируем стек вызовов, который вам дают:

Из-за конструкции, к сожалению, исключение и стек вызовов, которые вы видите в потоке пользовательского интерфейса, обычно не помогают в диагностике истинной причины проблемы.Это связано с тем, что к тому времени, когда возникает исключение, оно уже находится после точки отказа в потоке рендеринга.К этому времени в потоке рендеринга было потеряно критическое состояние, которое помогло бы нам понять, где и почему произошел сбой.

...