2016-08-02 9 views
-1

Ich habe in den letzten Wochen eine C# -Anwendung ausgeführt. Als ich es anfing, hatte es ~ 10000K Speicherverbrauch. Seitdem habe ich überprüft und es ist bei einem ~ 20000K Speicherbedarf.Sollte die Garbage Collection schon gelaufen sein?

Ich weiß nicht .Net Garbage Collection sehr gut, aber ist das ein Zeichen, dass ich definitiv ein Speicherleck haben? Sollte der GC nicht schon längst gelaufen sein?

Ich las in der Garbage Collection habe hier:

https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx

Und sie haben die folgenden Bedingungen für die bei der GC laufen soll:

  • Das System hat einen geringen physischen Speicher. (Ich habe weit über 70000K Speicher verwenden gelassen, so dass diese nicht ausgelöst werden soll)

  • Der Speicher, der durch zugeordnete Objekte auf dem verwalteten Heap verwendet wird übertrifft eine akzeptable Schwelle. Dieser Schwellenwert wird kontinuierlich angepasst, während der Prozess ausgeführt wird. (wie Sie „akzeptabel“ Schwelle definieren?)

Sollte ich nicht GC erwarten in wenigen Wochen den Zeitraum laufen zu lassen?

+1

Der häufigste Grund, warum Leute denken, dass .NET kein Müll sammelt, ist, dass sie missverstehen, was der Task-Manager ihnen zeigt und wie .NET den Haufen verwaltet. Nur weil der direkte Speicherverbrauch Ihres Programms reduziert wird, heißt das nicht, dass .NET den Speicher an Windows zurückgegeben hat. Oder vielleicht hast du ein Speicherleck. Wer weiß? Du hast kein gutes [mcve] geliefert. –

+0

Um zu überprüfen, ob ein Speicherverlust vorliegt, verwenden Sie den Task-Manager nicht. Verwenden Sie stattdessen einen geeigneten Speicherprofiler. Da ist einer mit Visual Stuidio. – jetstream96

+0

Von 10 MB auf 20 MB zu gehen, ohne jemals den Garbage Collector auszuführen, ist nur auf einer Server-Klasse-Maschine möglich.Es ist eine sehr geringe Menge an Speicher für ein typisches C# -Programm. Die Verwendung des verfügbaren RAM auf der Maschine ist der beste Weg, um Code schnell laufen zu lassen, und die CLR nutzt sie am besten. Sieht so aus, als ob dein Programm keine große Chance hat. Sie haben nur ein Leck, wenn Sie es konstant auf ~ 1,5 Gigabyte klettern können. Du musst die Schwelle zwischen deinen Ohren anpassen :) –

Antwort

0

Sollte ich nicht erwarten, GC in ein paar Wochen Zeitspanne laufen zu haben?

Nein, Sie sollten nicht erwarten, GC.Collect in zeitnaher Weise auftreten.

Garbage collection tritt auf, wenn eine der folgenden Bedingungen wahr :

  • Das System weist eine geringen physischen Speicher.
  • Der Speicher, der von zugeordneten Objekten auf dem verwalteten Heap verwendet wird, überschreitet einen akzeptablen Schwellenwert. Dieser Schwellenwert wird kontinuierlich
    angepasst, während der Prozess ausgeführt wird.
  • Die GC.Collect-Methode wird aufgerufen. In fast allen Fällen müssen Sie diese Methode nicht aufrufen, da der Garbage Collector kontinuierlich ausführt. Diese Methode wird hauptsächlich für einmalige Situationen und Testen verwendet.

das Lesen für mehr fundamental Details.