OutOfMemoryException - идеи из вашего опыта - PullRequest
0 голосов
/ 27 сентября 2019

У меня проблема с outofmemoryexception, с сообщением об ошибке, пойманным App_DispatcherUnhandledException (1 из некоторых сообщений об ошибках):

Message: Zgłoszono wyjątek typu 'System.OutOfMemoryException'. Source: PresentationFramework 

StackTrace:   
 w System.Windows.TreeChangeInfo.CreateParentInheritableProperties(DependencyObject d, DependencyObject parent, Boolean isAddOperation)
   w System.Windows.TreeWalkHelper.InvalidateOnTreeChange(FrameworkElement fe, FrameworkContentElement fce, DependencyObject parent, Boolean isAddOperation)
   w System.Windows.FrameworkElement.OnVisualParentChanged(DependencyObject oldParent)
   w System.Windows.Media.Visual.FireOnVisualParentChanged(DependencyObject oldParent)
   w System.Windows.Media.Visual.AddVisualChild(Visual child)
   w System.Windows.FrameworkElement.set_TemplateChild(UIElement value)
   w System.Windows.FrameworkTemplate.WireRootObjectToParent(Object createdObject, DependencyObject rootObject, DependencyObject container, FrameworkElement feContainer, INameScope nameScope)
   w System.Windows.FrameworkTemplate.HandleBeforeProperties(Object createdObject, DependencyObject& rootObject, DependencyObject container, FrameworkElement feContainer, INameScope nameScope)
   w System.Windows.FrameworkTemplate.<>c__DisplayClass45_0.<LoadOptimizedTemplateContent>b__2(Object sender, XamlObjectEventArgs args)
   w System.Xaml.XamlObjectWriter.OnBeforeProperties(Object value)
   w System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx)
   w System.Xaml.XamlObjectWriter.WriteEndObject()
   w System.Xaml.XamlWriter.WriteNode(XamlReader reader)
   w System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
   w System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
   w System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
   w System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
   w System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
   w System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
   w System.Windows.FrameworkElement.ApplyTemplate()
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Control.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w Telerik.Windows.Controls.GridView.GridViewCellsPanel.MeasureCell(IColumnElement column, GridViewCellBase cell, Size size)
   w Telerik.Windows.Controls.GridView.GridViewCellsPanel.RealizeAndMeasureCells(Int32 startIndex, Int32 predictedLastIndex, Func`2 calculateLastIndex)
   w Telerik.Windows.Controls.GridView.GridViewCellsPanel.UpdateVirtualizedCells()
   w Telerik.Windows.Controls.GridView.GridViewCellsPanel.MeasureOverride(Size availableSize)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
   w System.Windows.Controls.ItemsPresenter.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Control.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Border.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Control.MeasureOverride(Size constraint)
   w Telerik.Windows.Controls.GridView.GridViewRowItem.MeasureOverride(Size availableSize)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w Telerik.Windows.Controls.GridView.GridViewVirtualizingPanel.FlatLayoutStrategy.RealizeRows(Int32 startIndex, Int32 endIndex, Double& verticalOffset, HashSet`1& realizedRows)
   w Telerik.Windows.Controls.GridView.GridViewVirtualizingPanel.FlatLayoutStrategy.MeasureOverride(Size availableSize)
   w Telerik.Windows.Controls.GridView.GridViewVirtualizingPanel.MeasureOverride(Size availableSize)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
   w System.Windows.Controls.ScrollContentPresenter.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.ScrollViewer.MeasureOverride(Size constraint)
   w Telerik.Windows.Controls.GridView.GridViewScrollViewer.MeasureOverride(Size availableSize)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Control.MeasureOverride(Size constraint)
   w Telerik.Windows.Controls.GridView.GridViewDataControl.MeasureOverride(Size availableSize)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
   w System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
   w System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
   w System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
   w System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   w System.Windows.UIElement.Measure(Size availableSize)
   w System.Windows.ContextLayoutManager.UpdateLayout()
   w System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
   w System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
   w System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
   w System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
   w System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
   w System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   w System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

HResult: -2147024882

Вот некоторые сведения:

  • Приложение работает на RDS, с 15-25 пользователями, использующими приложение

  • Доступная память: 32 ГБ

  • Средняя используемая память: 17 ГБ

  • Не бывает ситуации, когда используемая память достигает 30 ГБ (максимальный пик был около 23 ГБ)

  • Процессор в порядке, в среднем 40%,достигает пиковых значений до 60%

  • Использование ОЗУ для экземпляра приложения увеличивается с использованием примерно до 1,5 ГБ на экземпляр.

  • Приложение было профилировано несколько раз, в соответствии с VS Profiler и другими профилировщиками (включая JetBrains one) было 0 утечек памяти

  • Приложениеиспользует библиотеки Telerik

  • Приложение использует Entity Framework

Я немного застрял и не знаю, где искать возможные проблемы.Оптимизация заняла у меня несколько недель, и все прошло довольно хорошо - мне удалось исправить типичные утечки памяти и проблемы с распределением памяти, иногда приложению нужно вручную запускать GC.Collect (), но это происходит довольно редко.Также нет шаблона, когда возникает OutOfMemoryException, и я не знаю, где искать проблему.Поэтому я ищу опытного разработчика WPF, чтобы, может быть, поделиться со мной своими экспериментами по таким вопросам.

Последняя вещь:

На мой взгляд, приложение слишком велико для WPF из-заклассический рост памяти WPF (приложение идет от 60 КБ до 1,5 КБ оперативной памяти в течение пары часов), но у меня нет другого выбора, кроме как решить эту проблему.

Есть идеи?

РЕДАКТИРОВАТЬ: я не администратор в среде RDS, есть другой парень, занимающийся развертыванием и администрированием, возможно, есть какие-то изменения, которые он, возможно, сделал, которые началивызвать эту проблему?

1 Ответ

0 голосов
/ 27 сентября 2019

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

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

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

...