我有一个C#/ WPF应用程序,可以在具有512 MB内存的小型平板电脑上运行。如果要继续运行,最终会抛出OutOfMemoryException。这可能需要12个小时到2天才能完成。
使用ProcessExplorer和.NET Memory Profiler,我看不到我的应用程序使用的内存随着时间的推移而增长的证据。只有一个典型的小增长模式,然后是垃圾收集。
我添加了代码,用于在抛出异常时打印出所有正在运行的进程及其内存信息。我现在正在等待它再次发生。我应该提到PC是基于闪存的,并且禁用了分页。 512是一个硬限制。
它发生在两台独立的PC上。两种情况下的异常信息都相同:
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)
非常感谢任何见解!
答案 0 :(得分:1)
由于您是“小型平板电脑”,也许您正在调用一些非“.Net”代码来控制某些硬件。是这样,也许该程序的一部分可能正在使用一个公平的内存(但仍然没有泄漏)。要在这种情况下让垃圾收集器更加努力,请查看添加GC.AddMemoryPressure()调用。
答案 1 :(得分:1)
事实证明,各种问题导致我的应用程序崩溃。我已经在另一个post here详细介绍了它们。
答案 2 :(得分:0)
我遇到了一篇非常好的文章,深入探讨了错误。
最有说服力的paragaph:不要试图分析你给出的调用堆栈:
由于设计,不幸的是,您看到的异常和callstack 在UI线程上通常不能帮助诊断真正的原因 这个问题。这是因为在抛出异常时 它已经在渲染线程上的失败点之后。这样 时间,关键状态已经丢失在渲染线程上 帮助我们了解故障发生的位置和原因。