Сервисные утечки памяти WCF

У меня есть очень маленький wcf сервис, размещенный в консольном приложении.

[ServiceContract]
public interface IService1
{
    [OperationContract]
    void DoService();
}

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class Service1 : IService1
{
    public void DoService()
    {

    }
}

и то, что это было названным как

using (ServiceReference1.Service1Client client = new ServiceReference1.Service1Client())
{
    client.DoService(new DoServiceRequest());
    client.Close();
} 

Помните, что сервис публикуется на basicHttpBindings.

Проблема

Теперь, когда я выполнил выше клиентского кода в цикле 1 000, я нашел большую разницу между "Всеми байтами "кучи"" и "Частными Байтами" счетчики производительности (я использовал профилировщика памяти .NET). После расследования я нашел, что некоторые объекты правильно не расположены, следующее является списком тех объектов (1 000 не склонных экземпляров были найдены->, равняется клиентским вызовам),

(пространством имен для всех них является Система. ServiceModel. Каналы)

HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream
BodyWriterMessage
BufferedMessage
HttpRequestContext.ListenerHttpContext.ListenerContextHttpInput.ListenerContextInputStream
HttpRequestContext.ListenerHttpContext 

Вопросы, Почему у нас есть партия не склонных объектов и как управлять ими.

Помогите

6
задан Mubashar 12 May 2010 в 11:39
поделиться

1 ответ

Вы запрашиваете новый экземпляр для каждого вызова (InstanceContextMode = InstanceContextMode.PerCall). Если сборщик мусора не выполняется в 1000 вызовах, то экземпляры службы не будут собраны. WCF требует, чтобы вы реализовали IDisposable

из MSDN: Откройте для себя мощные методы управления экземплярами для разработки приложений WCF

Per-Call Services Per-call Services Per-call Services - это режим создания экземпляров Windows Communication Foundation по умолчанию . Когда тип службы настроен для активации по отдельности, экземпляр службы, объект среды CLR, существует только во время выполнения клиентского вызова. Каждый клиентский запрос получает новый выделенный экземпляр службы. На рисунке 2 показано, как работает эта активация одним вызовом.

Figure 2 Per-Call Instantiation
(источник: microsoft.com )

  1. Клиент вызывает прокси, и прокси перенаправляет вызов службе .
  2. Windows Communication Foundation создает экземпляр службы и вызывает в нем метод.
  3. После возврата из вызова метода, если объект реализует IDisposable, тогда Windows Communication Foundation вызывает для него IDisposable.Dispose.
4
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: