2016-05-31 12 views
1

Ich habe eine lange laufende Anwendung, die aufgrund eines Speicherverlustes konsequent fehlschlägt.Verweise auf statische Eigenschaften verursachen Speicherverluste

Ich vermute, meine Verwendung von statischen Eigenschaften kann die Ursache sein. Hier ist ein Beispiel dafür, was ich heute:

public class StaticReferences 
{ 
    public static readonly object Fixed1 = new object(); 
} 

public class ShortLived 
{ 
    public object Object1; 
} 

public class Doer // This class is instantiated once 
{ 
    public void DoStuff() // This method is called over and over again. 
    { 
     var shortLived = new ShortLived() 
     { 
      Object1 = StaticReferences.Fixed1 
     }; 
    } 
} 

Wird eine Instanz von ShortLived mit seinem Verweis auf StaticReferences.Fixed1 (über die ShortLived.Object1 Eigenschaft) erhalten richtig Müll gesammelt, wenn es außerhalb des Gültigkeitsbereichs ist?

+4

Was lässt Sie glauben, dass ein Speicherleck vorliegt? –

+0

Es handelt sich um eine Konsolenanwendung, die einen Prozess ausführt, der einige Stunden in Anspruch nimmt. Es schlägt mit einer Out of Memory-Ausnahme fehl. Ich lief es durch Jetbrains DotMemory. Der nicht verwaltete Speicherplatz wächst weiter. Managed memorý ist stabil .. –

+3

@JakobGade Was macht Ihr Programm, das nicht verwalteten Speicher benötigt? Wird dieser Teil von Ihnen oder einer Drittanbieterkomponente implementiert? Wie wird nicht verwalteter Speicher gehandhabt? – xxbbcc

Antwort

4

Nein, das Verweisen auf globale statische Eigenschaften verursacht kein Speicherleck. Das von Ihnen gepostete Beispiel ist in Ordnung. shortLived wird bereinigt, sobald der Bereich beendet ist und der Verweis auf Fixed1 wird bereinigt, wenn Ihr Programm beendet wird. Ihr Problem ist sehr wahrscheinlich anderswo, aber es ist unmöglich, aus Ihrem einfachen Beispiel zu sagen. Hast du irgendwelche Beweise dafür, dass du auf ein Speicherleck schaust?

Ich schlage vor, Sie verwenden einen Speicher-Profiler oder erhalten Sie einen vollständigen Speicherauszug und analysieren Sie es (WinDbg ist kostenlos, aber es gibt andere, einfacher zu bedienen, aber Pay-Tools auch). Ein anderes Tool, das Sie verwenden können, ist DebugDiag von Microsoft (auch kostenlos) - Holen Sie sich einen Dump und dann führen Sie es durch DebugDiag, um einen Speicherbericht zu erhalten.

Wie @EricJ in seinem Kommentar erwähnt, ist der Profiler in Visual Studio 2015 auch ein großartiges Werkzeug zur Analyse der Speichernutzung und es ist in allen Editionen verfügbar, einschließlich der kostenlosen Community Edition.

+1

Der Speicherprofiler in VS2015 funktioniert gut und ist sogar in der Community-Edition https://blogs.msdn.microsoft.com/visualstudioalm/2015/07/20/performance-and-diagnostic-tools-in-visual-studio verfügbar -2015/ –

+0

@EricJ. Danke, ich werde meine Antwort aktualisieren, um das auch zu berücksichtigen, wenn es Ihnen nichts ausmacht. – xxbbcc

+0

Sicher ist es immer eine gute Idee, Ihre Antwort so vollständig und nützlich wie möglich zu halten. –