2010-05-10 6 views
7

У меня есть веб-сайт, который бросает OutOfMemoryExceptions всякий раз, когда он попадает в следующую точку в моем коде:.NET OutOfMemoryException на XMLSerializer.Serialize

XmlSerializer xs = new XmlSerializer(t, xoverrides); 

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

У вас было это раньше? Почувствуйте, как помочь мне диагностировать проблему? Любая помощь приветствуется.

Спасибо!

ответ

9

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

Есть несколько решений:

  1. Кэш-память XmlSerializer, который вы создаете.
  2. Используйте одну из перегрузок конструктора XmlSerializer, которая реализует кеширование. Похоже, вы используете XmlSerializer (Type, XmlAttributeOverrides), который не реализует кэширование. XmlSerializer (Тип) и XmlSerializer (Тип, строка) реализуют кэширование.

Microsoft KB : Memory usage is high when you create several XmlSerializer objects in ASP.NET

+0

Привет, я перед аналогичной проблемой в то время как я использую "новый XmlSerializer (o.GetType());". Я столкнулся с этой проблемой на своей локальной машине с очень большими данными, которые были сериализованы, она не дает никаких исключений в реальном приложении, которое размещается на облачном сервере. Но я не могу использовать и тестировать сериализованную строку дальше во время разработки. Я открыт для предложений. –

0

Если я помню из подобных проблем некоторое время назад, XmlSerializer нуждается в тонне памяти больше, чем данные, обрабатываемые ею. Я не уверен, почему это так.