2010-05-12 14 views
6

Ich habe einen sehr kleinen WCF-Dienst in einer Konsolen-App gehostet.WCF Service Memory Lecks

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

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

    } 
} 

und sein Wesen genannt als

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

Bitte denken Sie daran, dass Zustellungen an basicHttpBindings veröffentlicht wird.

Problem

Nun, wenn ich oben Client-Code in einer Schleife von 1000 durchgeführt, fand ich großen Unterschied zwischen "All Heap Bytes" und "Private Bytes" Leistungsindikatoren (i verwendet .net Speicher Profiler). Nach der Untersuchung fand ich einige der Objekte sind nicht richtig entsorgt folgende sind die Liste dieser Objekte (1000 undisposed Instanz wurden gefunden -> entspricht den Clientaufrufen)

(Namespace für alle von ihnen ist System.ServiceModel. Kanäle)

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

Fragen Warum tun wir viel undisposed Objekte haben und wie sie zu kontrollieren.

Bitte Hilfe

+1

Sieht aus wie eine Systembibliothek Leck zu mir. Der Client-Code (wie im Code des Benutzers geschrieben) berührt diese Puffer und Streams nicht und sieht so aus, als ob WCF sie nicht entsorgt. –

+0

Mabushar: Hattest du Glück dabei? Ich habe anscheinend ein ähnliches Problem. – bugfixr

+0

@bugfixr Tut mir leid Bruder Ich habe Sie heute Nachricht bemerkt, ich erinnere mich nicht, wenn ich diese loswerden konnte, aber eine Sache, die ich erinnere, war, dass ich Framework 4.0 von Framework 3.5 verschoben, half es teilweise oder vollständig ich nicht Erinnere dich, aber es hat mir irgendwie geholfen. Entschuldigung für die späte Antwort. –

Antwort

0

Ich habe die Lösung im Jahr 2010 gefunden, aber ich habe vergessen, es zu posten. Ich habe tatsächlich genaue Spur verloren, aber ich erinnere mich, es war .Net Bibliothek Bug, der Microsoft gemeldet wurde und wurde von ihnen anerkannt. Ich habe seinen Link nicht, aber ich würde es veröffentlichen, sobald ich es finden kann. Jedenfalls hat Microsoft dieses Problem in .net 4.0 behoben und das ist die genaue Lösung, der ich folgte, ich weiß für einige von Ihnen, dass es nicht möglich ist, aufgrund der Änderung der Serverumgebung manchmal nicht in Ihren Händen.

4

Sie eine neue Instanz pro Anruf anfordert (InstanceContextMode = InstanceContextMode.PerCall). Wenn in den 1000 Aufrufen kein GC stattfindet, werden die Dienstinstanzen nicht abgeholt. WCF erfordert, dass Sie IDisposable

Von MSDN : Discover Mighty Instance Management Techniques For Developing WCF Apps

Per-Call Services Per-Call-Dienste sind die Windows Communication Foundation Standard Instanziierung Modus implementieren. Wenn der Diensttyp für die Aktivierung pro Aufruf konfiguriert ist, existiert nur während eines Clientaufrufs eine Dienstinstanz, ein Common Language Runtime (CLR) -Objekt. Jede Clientanforderung erhält eine neue dedizierte Serviceinstanz. Abbildung 2 zeigt, wie diese Einzelrufaktivierung funktioniert.

Figure 2 Per-Call Instantiation http://i.msdn.microsoft.com/cc163590.fig02(en-us).gif

  1. Der Kunde ruft das Proxy und die Proxy leitet den Anruf an den Service.
  2. Windows Communication Foundation erstellt einen Dienst Instanz und ruft die Methode darauf auf.
  3. nach dem Methodenaufruf zurückkehrt, wenn das Objekt IDisposable implementiert, dann auf Windows Communication Foundation ruft IDisposable.Dispose darauf.
+1

Ich habe diesen Artikel schon einmal gesehen und es ist wahr, dass es die Dispose-Methode automatisch aufruft, wenn es welche gibt und das nur, wenn Sie eine Ressource selbst geöffnet haben und aufräumen müssen. In diesem Fall müssen Sie sie selbst reinigen. Aber in meinem Fall habe ich keine Ressourcen zu reinigen. Wie auch immer, ich habe das schon ausprobiert, aber dasselbe Ergebnis. Außerdem möchte ich Ihnen sagen, dass GC den Heap bereinigt hat, aber der Native-Speicher nicht gereinigt wurde, da diese Objekte UNDisposed gesammelt wurden. –

1

Haben Sie gelegentlich Leistungsindikatoren aktiviert? Wie unten?

<system.serviceModel> 
    <diagnostics performanceCounters="All" /> 
    .. 
</system.serviceModel> 

In Absatz „Erhöhung der für Leistungsindikatoren Speichergröße“, von diesem Link: http://msdn.microsoft.com/en-us/library/ms735098.aspx

der Rede von einem „Schurkenstaat“ Privaten Bytes zählen ist, wenn WCF-Leistungsindikatoren aktiviert sind. Wenn Sie es in ServiceOnly ändern oder es vollständig deaktivieren (Off), kann das der Fall sein.