.NET OutOfMemoryException в XMLSerializer.Serialize - PullRequest
7 голосов
/ 10 мая 2010

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

XmlSerializer xs = new XmlSerializer(t, xoverrides);

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

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

Спасибо!

Ответы [ 2 ]

9 голосов
/ 19 мая 2010

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

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

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

Microsoft KB: интенсивное использование памяти при создании нескольких объектов XmlSerializer в ASP.NET

0 голосов
/ 10 мая 2010

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

...