2017-09-10 2 views
0

Ich beschäftige mich mit meinem C# Programmspeicherverbrauch Ich habe eine Speicherkontrolle zwischen dem Start und dem Ende meiner App eingerichtet, um Speicherlecks zu erkennen. Ich habe Warnung, wenn Entity Framework 6 mit Firebird:Entity Framework nicht Speicher freigeben?

var m = GC.GetTotalMemory(true)/1024/1024; // 2MB 

using (Entities context = new Entities(ConnectionString)) 
{ 
    m = GC.GetTotalMemory(true)/1024/1024; //2MB 
    context.MYTABLE.FirstOrDefault(); 
    m = GC.GetTotalMemory(true)/1024/1024; // 5MB 
} 

m = GC.GetTotalMemory(true)/1024/1024; // 5MB ?? 

Durch die context.MYTABLE Linie Kommentierung aus, wird Speicher bei 2MB bleiben.

Ich weiß alles wird entsorgt, wenn die Anwendung beendet wird, aber ich möchte Speicherlecks auf meinen Objekten erkennen und dieses EF-Problem verhindern, dass.

Gibt es eine Möglichkeit, diesen zusätzlichen Speicher, der von EF verwendet wird, zu entsorgen?

Könnte dieses Problem vom Firebird EF Treiber verursacht werden?

Tia

+0

Es macht wenig Sinn, den Speicher zu messen, der von einem kleinen Codeblock in einer Welt verwendet wird, in der Sie Speicherzuweisung und Freigabe in feinen Details nicht steuern. EF speichert Dinge im Gedächtnis, um die Dinge zu beschleunigen, und Sie versuchen besser nicht, damit zu spielen. – Steve

+0

Laufen Sie 'Debug' oder' Release' Build? – mjwills

+1

Haben Sie versucht, den gleichen Code zweiten, dritten usw. Zeit zu messen? Da EF das Metadatenmodell zum ersten Mal erstellt und zwischenspeichert. –

Antwort

0

Gibt es eine Möglichkeit, diesen von EF verwendeten zusätzlichen Speicher zu entsorgen?

Nein - es gibt keine Möglichkeit zu Release, die zusätzlichen Speicher in einem Art und Weise gewährleistet.

Die documentation für GetTotalMemory(true) Zustände:

Bemerkungen Wenn der forceFullCollection Parameter wahr ist, ist diese Methode vor der Rückkehr, während des Systems ein kurzes Intervall wartet sammelt Müll und finalisiert Objekte. Die Dauer des Intervalls ist ein intern spezifizierter Grenzwert , der durch die Anzahl der verarbeiteten Sammelzyklen und die Änderung der zwischen den Zyklen wiedergewonnenen Speichermenge bestimmt wird. Der Garbage Collector garantiert nicht , dass alle nicht zugreifbaren Speicher gesammelt werden.

Hinweis insbesondere im letzten Satz:

Der Garbage Collector ist keine Garantie, dass alle unzugänglichen Speicher gesammelt.

Auf dieses, Entity Framework (und/oder Firebird-Treiber) einige Informationen wahrscheinlich hält über die gesamte Lebensdauer der Anwendung im RAM zwischengespeichert. Und einige davon werden wahrscheinlich niemals gewertet werden.

+0

Danke. Ich habe den zusätzlichen Speicher in meine Speicherlecksuche aufgenommen. –

3

Es gibt keinen Grund für den Garbage Collector ist auszuführen, nachdem Sie den using Block verlassen (mit garantiert nur, dass die Dispose Methode der context aufgerufen wird). Sie können eine Speicherbereinigung erzwingen, indem Sie GC.Collect() verwenden.

Im Allgemeinen leben Entitäten, die mit EF geladen werden, im Allgemeinen so lange wie der Kontext, mit dem sie verknüpft sind, es sei denn, Sie entfernen sie manuell aus dem Kontext.

Ich kann nicht mit einem Speicherverlust im Firebird-Treiber für EF sprechen, aber was Sie sehen, ist erwartet Begaiour.

+1

'GetTotalMemory (true)' soll ein 'GC.Collect' machen. Das explizite Hinzufügen der Sammlung ändert nichts. –