WCF-сериализация и кеширование - PullRequest
3 голосов
/ 13 июня 2011

У меня есть служба WCF, размещенная в консольном приложении. и у меня есть ChannelFactory для вызова контрактов на операции WCF.

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

Я проверяю использование служебной памяти через диспетчер задач в Windows 7. Когда я вызываю операцию, которая ничего не возвращает, память не увеличивается, но когда я вызываю операцию, которая возвращает данные, память увеличивается и остается такой даже после того, как данные возвращены клиенту.

Я предполагаю, что это проблема кэширования сериализации?!?

Ответы [ 3 ]

3 голосов
/ 13 июня 2011

Похоже, сборщик мусора еще не запущен, и из-за этого память не была освобождена.Более того, при размещении службы WCF в консольном приложении GC работает в режиме рабочей станции, что может быть менее эффективно в этом случае.

2 голосов
/ 13 июня 2011

Память, вероятно, будет оставаться увеличенной до тех пор, пока GC не запустится, что не будет соответствовать моменту, когда данные будут возвращены клиенту.

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


Редактировать:

Память останется в работе, пока не будет запущен сборщик мусора.Если у вашего процесса все еще есть много свободного места в куче, то для запуска GC действительно нет причин.

Согласно MSDN: http://msdn.microsoft.com/en-us/library/ee787088.aspx#conditions_for_a_garbage_collection

Мусорсбор происходит, когда выполняется одно из следующих условий:

  • В системе недостаточно физической памяти.

  • Память, используемая выделенными объектамипо управляемой куче превосходит приемлемый порог.Это означает, что в управляемой куче превышен порог допустимого использования памяти.Этот порог непрерывно регулируется по мере выполнения процесса.

  • Вызывается метод GC.Collect.Почти во всех случаях вам не нужно вызывать этот метод, потому что сборщик мусора работает непрерывно.Этот метод в основном используется для уникальных ситуаций и тестирования.

Вероятно, вы выделяете объекты в куче, но они не являются GC'd, потому что GC видитнет причин для запуска (в генерации кучи все еще есть свободное пространство, и нет смысла тратить время на его очистку).

Однако, если вы можете повторять свой вызов WCF снова и снова и в итоге получить Out ofИсключение памяти, тогда это будет означать, что у вас действительно есть проблема с хранением ссылок где-то.В этом случае я бы использовал профилировщик памяти, чтобы определить, что и на чем удерживается.


Правка # 2:

См. Также эту ветку: C #Поток не освобождает память

1 голос
/ 13 июня 2011

Используйте инструмент, подобный этому, чтобы увидеть, какие объекты создаются / собираются: http://memprofiler.com/

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

...