WPF WCF MVVM OutOfMemoryException - PullRequest
       4

WPF WCF MVVM OutOfMemoryException

3 голосов
/ 12 октября 2010

Я работаю над этим приложением WCF-WPF. Я часто получаю эту ошибку в асинхронном XamDataGrid. Попытка сделать вызов WCF и заполнить таблицу. Сначала я думал, что это как-то связано с большими объемами данных, возвращаемых из WCF, и я сделал так, чтобы данные возврата вызовов были очень маленькими, вызывая только для категории. Эта ошибка появляется случайно, не всегда для одного и того же набора данных. Воспроизводимый достаточно в 15-20 попыток.

Я работаю под управлением Windows XP (32-разрядная версия), Dual Core, с 4 ГБ оперативной памяти. Когда возникает это исключение, клиентский компьютер использует только около 2 ГБ ОЗУ, а на сервере W3WP использует только 800 МБ (из 6 ГБ, 3 ядра. Общее использование памяти на сервере составляет ~ 2 ГБ).

Это происходит только на машинах с XP. Не появляется эта ошибка на Windows 7 box.

Пожалуйста, объясните мне, как решить эту проблему.

Заранее спасибо

Event Viewer Logs this Message:
Event Type: Error
Event Source:   .NET Runtime 2.0 Error Reporting
Event Category: None
Event ID:   5000
Date:       10/13/2010
Time:       10:50:07 AM
User:       N/A
Computer:   COMP-DC7800
Description:
EventType clr20r3, P1 appname.exe, P2 2.0.0.21872, P3 4cb0a1b1, P4 mscorlib, P5 2.0.0.0, P6 492b834a, P7 35df, P8 45, P9 system.outofmemoryexception, P10 NIL.

Ниже указаны детали исключения:

System.OutOfMemoryException was unhandled
Message="Exception of type 'System.OutOfMemoryException' was thrown."
Source="mscorlib"
StackTrace:
   at System.IO.MemoryStream.set_Capacity(Int32 value)
   at System.IO.MemoryStream.EnsureCapacity(Int32 value)
   at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.Xml.XmlMtomReader.MimePart.GetBuffer(Int32 maxBuffer, Int32& remaining)
   at System.Xml.XmlMtomReader.Initialize(Stream stream, String contentType, XmlDictionaryReaderQuotas quotas, Int32 maxBufferSize)
   at System.Xml.XmlMtomReader.SetInput(Stream stream, Encoding[] encodings, String contentType, XmlDictionaryReaderQuotas quotas, Int32 maxBufferSize, OnXmlDictionaryReaderClose onClose)
   at System.Xml.XmlMtomReader.SetInput(Byte[] buffer, Int32 offset, Int32 count, Encoding[] encodings, String contentType, XmlDictionaryReaderQuotas quotas, Int32 maxBufferSize, OnXmlDictionaryReaderClose onClose)
   at System.ServiceModel.Channels.MtomMessageEncoder.MtomBufferedMessageData.TakeXmlReader()
   at System.ServiceModel.Channels.BufferedMessageData.DoTakeXmlReader()
   at System.ServiceModel.Channels.BufferedMessageData.GetMessageReader()
   at System.ServiceModel.Channels.MessageHeaders.GetBufferedMessageHeaderReaderAtHeaderContents(IBufferedMessageData bufferedMessageData)
   at System.ServiceModel.Channels.MessageHeaders.GetBufferedMessageHeaderReader(IBufferedMessageData bufferedMessageData, Int32 bufferedMessageHeaderIndex)
   at System.ServiceModel.Channels.MessageHeaders.GetReaderAtHeader(Int32 headerIndex)
   at System.ServiceModel.Channels.WsrmMessageInfo.Get(MessageVersion messageVersion, ReliableMessagingVersion reliableMessagingVersion, IChannel channel, ISession session, Message message, Boolean csrOnly)
   at System.ServiceModel.Channels.ReliableDuplexSessionChannel.HandleReceiveComplete(IAsyncResult result)
   at System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic(IAsyncResult result)
   at System.ServiceModel.Diagnostics.Utility.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.ReliableChannelBinder`1.InputAsyncResult`1.OnInputComplete(IAsyncResult result)
   at System.ServiceModel.Channels.ReliableChannelBinder`1.InputAsyncResult`1.OnInputCompleteStatic(IAsyncResult result)
   at System.ServiceModel.Diagnostics.Utility.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.InputQueue`1.AsyncQueueReader.Set(Item item)
   at System.ServiceModel.Channels.InputQueue`1.Dispatch()
   at System.ServiceModel.Channels.InputQueue`1.OnDispatchCallback(Object state)
   at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2()
   at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.OnSecurityContextCallback(Object o)
   at System.Security.SecurityContext.Run(SecurityContext securityContext, ContextCallback callback, Object state)
   at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke()
   at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks()
   at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.CompletionCallback(Object state)
   at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

Ответы [ 3 ]

1 голос
/ 14 декабря 2010

Исключения OutOfMemory могут возникать по многим причинам в целом и в веб-приложениях в частности.

Во-первых, если вы работаете в IIS, существуют настройки, специфичные для IIS, для ограничения памяти, см. Здесь: http://blogs.msdn.com/b/pfedev/archive/2009/01/22/memory-based-recycling-in-iis-6-0.aspx

В зависимости от вашей конфигурации, пулов и т. Д. Эти ограничения могут не применяться к веб-приложениям .NET.

Теперь в ASP.NET также есть параметр memoryLimit в файле machine.config , который задает максимально допустимый объем памяти в процентах от общей системной памяти, что рабочий процесс может использовать до того, как ASP.NET запустит новый процесс и переназначит существующие запросы.

По умолчанию установлено значение 60%, что равно 1,2 ГБ на аппарате 2G.

Однако ... что бы вы ни настраивали, 800M - это практический предел для приложений ASP.NET на 32-разрядной машине, см. Хорошее объяснение здесь: Понимание памяти ASP.Net

Решение, позволяющее избежать этого, состоит в том, чтобы изменить работу вашей системы и разбить ее на более мелкие части.

Вот почему по умолчанию WCF был тщательно сконфигурирован с таким количеством ограничений (см. Здесь полный список: http://weblogs.asp.net/paolopia/archive/2008/03/23/wcf-configuration-default-limits-concurrency-and-scalability.aspx) ..., который почти каждый разработчик стремится изменить и довести до максимума, как только он обнаружит это: -)

0 голосов
/ 06 января 2011

Почувствуйте облегчение, найдя ответ, что Microsoft все испортила ... :). эта вина почти спасла мою работу ... Вот история .. WCF имеет размер сообщения по умолчанию 64 КБ. Невозможно найти причину этого в MSDN ... и поэтому, когда нам нужно изменить максимальный размер сообщения на то, что мы хотим. Проблема в том, что порог для LOH составляет 85000b. Если размер сообщения больше этого, объект будет помещен в LOH, ваш профилировщик покажет, что объекты собраны ... но когда вы увидите размер LOH в Sysinternals Process Explorer, окне свойств процесса, вы все равно увидите, что память использование увеличивается. Приблизительно в 800 МБ наш могущественный доктор Уотсон приходит и запускает это приложение. По-видимому, это известная проблема с WCF & .net 2.0

image Проблема все еще существует в .net 4.0, но Microsoft выпустила quickfix . Sysinternals Process Explorer - это инструмент, который помог диагностировать эту проблему. Снимок экрана

0 голосов
/ 14 декабря 2010

Вы не сможете использовать эти 4 ГБ ОЗУ с 32-битной ОС.

http://chris.pirillo.com/32-bit-windows-and-4gb-of-ram/

Если ваше приложение потребляет все больше и больше памяти при использовании.Вы можете посмотреть на управление памятью.Посмотрите на реализацию интерфейса IDisposable для классов с неуправляемыми ресурсами.Кроме того, избегайте хранения ссылок на объекты, как только вы закончите их использовать.События особенно плохи для этого.

Как события вызывают утечки памяти в C # и как Weak References помогают уменьшить это?

Вы также можете посмотреть на потоковую передачувременный файл вместо потоковой передачи в память.

...