Память потребляется динамически генерируемыми сборками времени выполнения, созданными внутри конструктора XmlSerializer
. Из документации а>:
Динамически генерируемые сборки
Для повышения производительности инфраструктура сериализации XML динамически создает сборки для сериализации и десериализации указанных типов.
Это означает, что первый раз, когда вы создаете XmlSerializer
для определенного типа, отражение используется для создания кода C#, который сериализует и десериализует тип и все типы, на которые ссылаются, которые затем связываются и загружаются в объем памяти. Вы можете увидеть справочный исходный код, который делает это, в TempAssembly
< /а> класс. Загрузка динамической сборки потребляет память, и эта память никогда не освобождается до AppDomain
выгружается.
Однако после создания динамическая сборка кэшируется и повторно используется средой выполнения в следующих ситуациях:
Инфраструктура находит и повторно использует эти сборки. Это происходит только при использовании следующих конструкторов:
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
.
При использовании любого из других конструкторов создается несколько версий одной и той же сборки, которые никогда не выгружаются, что приводит к утечке памяти и снижению производительности. Самое простое решение — использовать один из двух ранее упомянутых конструкторов. В противном случае вы должны кэшировать сборки в Hashtable...
Поскольку вы используете первый конструктор, ваша динамическая сборка кэшируется и используется повторно, а это означает, что потребление памяти является одноразовым событием во время выполнения вашего приложения < em>для каждого корневого типа, который вы сериализуете. Пока вы сериализуете только конечное число типов, память, используемая этими динамическими сборками, ограничена и стабилизируется довольно быстро.
(Если вам нужно сериализовать потенциально неограниченное количество типов, потому что вы делаете, скажем, динамическая генерация классов, то использование памяти может увеличиваться. Но я сомневаюсь, что вы это делаете.)
person
dbc
schedule
23.06.2015