Binding XmlSerializer'ов приводит к перерасходу памяти при запуске приложения
От: LWhisper  
Дата: 09.09.16 17:45
Оценка: 22 (1)
Всем привет.

Есть WebService. В качестве API предоставляет WSDL, на основе которых генерируются модельные объекты и сборка XmlSerializers.
Типов очень много. В момент первого обращения происходит задержка (2-3 секунды) и резкий скачок по памяти (1 Гб), в течении которых происходит "связывание" объектов сериализации. Как это происходит в дебрях .NET Framework представляю довольно смутно.

Проблема возникает, если одновременно запускаются десятки таких процессов. Каждый из них моментально отжирает гигабайт памяти.
Подскажите — как можно минимизировать потребление памяти или вручную запустить инициализацию, предварительно спрятав вызов за мьютексом?

Добавлю, что WSDL очень грязыне, содержат массу Xml-аттрибутов. Разработчик предоставляет специальную утилиту для чистки .cs файлов перед сборкой DLL.

SDK находится в публичном доступе, поэтому, при необходимости, могу скинуть ссылки на WSDL, .CS, и итоговую DLL (без подписи, разумеется).
Но, может быть, кто-нибудь уже сталкивался с подобной ситуацией, или знает как работает связывание XmlSerializer'ов в .NET и может подсказать, в чём может быть проблема и как её решать?
.net xmlserializer soap memory wsdl
Re: Binding XmlSerializer'ов приводит к перерасходу памяти при запуске приложени
От: Sharov Россия  
Дата: 09.09.16 19:19
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Всем привет.


LW>Есть WebService. В качестве API предоставляет WSDL, на основе которых генерируются модельные объекты и сборка XmlSerializers.

LW>Типов очень много. В момент первого обращения происходит задержка (2-3 секунды) и резкий скачок по памяти (1 Гб), в течении которых происходит "связывание" объектов сериализации. Как это происходит в дебрях .NET Framework представляю довольно смутно.

LW>Проблема возникает, если одновременно запускаются десятки таких процессов. Каждый из них моментально отжирает гигабайт памяти.

LW>Подскажите — как можно минимизировать потребление памяти или вручную запустить инициализацию, предварительно спрятав вызов за мьютексом?

LW>Добавлю, что WSDL очень грязыне, содержат массу Xml-аттрибутов. Разработчик предоставляет специальную утилиту для чистки .cs файлов перед сборкой DLL.


LW>SDK находится в публичном доступе, поэтому, при необходимости, могу скинуть ссылки на WSDL, .CS, и итоговую DLL (без подписи, разумеется).

LW>Но, может быть, кто-нибудь уже сталкивался с подобной ситуацией, или знает как работает связывание XmlSerializer'ов в .NET и может подсказать, в чём может быть проблема и как её решать?

Гуглить пробовали --- тынц и тынц. Оно?
Кодом людям нужно помогать!
Re[2]: Binding XmlSerializer'ов приводит к перерасходу памят
От: Sinix  
Дата: 09.09.16 19:49
Оценка: 4 (1) +1
Здравствуйте, Sharov, Вы писали:

S>Гуглить пробовали --- тынц и тынц. Оно?


Непохоже, кмк. LWhisper явно пишет что xmlSerializers уже сгенерены, так что я в лёгком недоумении. Тормоза при первом обращении + стабильно воспроизводится => остаётся или jit, или сторонняя логика при загрузке библиотек. Я бы запустил с mem-профайлером и смотрел бы на что именно уходит время / память. Дальше проще будет.
Отредактировано 09.09.2016 19:51 Sinix . Предыдущая версия .
Re[3]: Binding XmlSerializer'ов приводит к перерасходу памят
От: LWhisper  
Дата: 09.09.16 22:06
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Непохоже, кмк. LWhisper явно пишет что xmlSerializers уже сгенерены, так что я в лёгком недоумении. Тормоза при первом обращении + стабильно воспроизводится => остаётся или jit, или сторонняя логика при загрузке библиотек. Я бы запустил с mem-профайлером и смотрел бы на что именно уходит время / память. Дальше проще будет.

Так и поступлю. Показательно, что без чистки .cs от лишних аттрибутов, загрузка вместо нескольких секунд занимает несколько минут. >_>
Re[4]: Binding XmlSerializer'ов приводит к перерасходу памят
От: Sinix  
Дата: 10.09.16 06:00
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Так и поступлю. Показательно, что без чистки .cs от лишних аттрибутов, загрузка вместо нескольких секунд занимает несколько минут. >_>

Хм, а сборки сгенерированные точно подхватились? Вопрос конечно дурацкий, но и поведение 1-в-1 как без них.
Re[5]: Binding XmlSerializer'ов приводит к перерасходу памят
От: LWhisper  
Дата: 10.09.16 09:40
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, LWhisper, Вы писали:


LW>>Так и поступлю. Показательно, что без чистки .cs от лишних аттрибутов, загрузка вместо нескольких секунд занимает несколько минут. >_>

S>Хм, а сборки сгенерированные точно подхватились? Вопрос конечно дурацкий, но и поведение 1-в-1 как без них.

Да вот о том же думал, но в списке загруженных модулей значатся.
Могу предположить, что происходит сопоставление на основе аттрибутов сериализуемых сущностей и соответствующих им сериализаторов.
Кстати, всего их 2879 штук. Сборка с сериализаторами весит 8.5 мб.
Re: Binding XmlSerializer'ов приводит к перерасходу памяти при запуске приложени
От: LWhisper  
Дата: 10.09.16 09:53
Оценка: +1
Хм, большую часть памяти на момент снятия снапшота зажирали вот эти друзья.
Быть может, проблема не в Xml-сериализаторах, а именно в кэше SoapHttpClientProtocol?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.