2016-03-21 14 views
1

Wenn der Speicherabbild analysiert wird, zeigt es, dass diese bestimmte Zeichenfolge-Variable, die den XML-Inhalt enthält, Speicherverlust verursacht. Ich las den Artikel über einige, die LOH Gen 2. So. Net Garbage Collection auf LoH

  1. Will Garbage Collector aufgerufen wird, geht, wenn Gen 0 und Gen 1 nicht unter Druck steht und Gen 2 ist unter Druck aufgrund LoH?
  2. Wird es zu Gen 2 gehen, wenn es Gen 0 oder Gen 1 Speicher freigegeben hat?
  3. Wenn ja, was ist der bessere Weg, damit umzugehen?
+0

Ist LoH der Große Objekt Haufen? Fügen Sie die Framework-Version für Fragen ein, die den GC betreffen, und versuchen Sie, mehr darüber zu erfahren. –

+0

Fügen Sie auch einen Link zu dem Artikel ein, den Sie gelesen haben –

+0

Gibt es einen Verweis auf diesen String? Ist es vielleicht interniert? – Luaan

Antwort

0
  1. Nein, es wird nicht
  2. Nur wenn es genügend Speicher Druck

Allerdings, wenn Ihre Anwendung Zuteilungen zu tun ist, ist es ziemlich unwahrscheinlich, dass die Saite zu lange überleben wird. Und wenn der Speicherdruck nicht ausreicht, hat der GC wenig Grund, den Speicher freizugeben.

Stellen Sie sicher, dass die Zeichenfolge nicht mehr referenziert wird. Zählen Sie die Referenzen, überprüfen Sie, dass es nicht interniert ist.

Sie können eine Speicherbereinigung erzwingen, aber es ist eine gute Möglichkeit, die GC-Leistung zu beeinträchtigen. Es kann die beste Lösung für Ihren Fall sein, wenn Ihre Anwendung die ungeraden "Zuweisung einer großen Zeichenfolge und dann vergessen Sie es" -Operation, und Sie kümmern sich um Speicher für den Rest des Systems (es gibt keinen Vorteil Ihre Anwendung). Es hat keinen Sinn, das zu versuchen, wenn Sie trotzdem viele Zuweisungen vornehmen. In diesem Fall suchen Sie nach Speicherlecks auf Ihrer Seite. WinDbg kann helfen.

+0

Ich habe WinDbg verwendet, um zu analysieren. 1. String ist nicht interniert. –

+0

Geringfügige Änderung an meiner Frage 1 Wird der Garbage Collector aufgerufen, wenn Gen 0 und Gen 1 nicht unter Druck stehen und Gen 2 wegen LoH unter Druck steht? –

+0

@SudheeshP Es gibt keine solche Sache, also nein, wird es nicht. Das ist der Punkt, an dem überhaupt die Generationenhaufen stehen. Und AFAIK, die Grenzen (und Zuweisungsschwellen) für jede der Generationen erhöhen sich, wenn Sie insgesamt viel Speicher benötigen, obwohl ich nicht sicher bin, ob dies auch für "eine große Sache auf LOH" gilt. Am Ende ist die Vermeidung der Zuweisung einer so großen Zeichenkette sowieso der beste Weg (die meisten APIs erlauben das Streaming). Warum kümmert es dich auch, wenn der Speicher freigegeben wird? Hast du Probleme oder hast du nur Angst vor der großen Zahl im Aufgabenmanager? – Luaan

0

1. Wird der Garbage Collector aufgerufen, wenn Gen 0 und Gen 1 nicht unter Druck stehen? Wenn in Generation0 und Generation2 genügend Speicherplatz vorhanden ist, wird Garbage Collector nicht aufgerufen.

Wenn in Generation0 und Generation2 genügend Speicherplatz vorhanden ist, bedeutet dies, dass genug Platz vorhanden ist, um neue Objekte zu erstellen, und es gibt keinen Grund, Garabage Collection auszuführen.

2. Wird es zu Gen 2 gehen, wenn es Gen 0 oder Gen 1 Speicher freigegeben hat?

Wenn das Objekt nach dem Garbage Collection in Generation1 und in den Generation1 überlebt, dann wird das Objekt Generation2 bewegt werden.

3. Wenn ja, was ist der bessere Weg, damit umzugehen?

  • Um ein Objekt aus Haufen zu zerstören, sollten Sie nur Verweise dieser Zeichenfolge löschen. Ihre string Variable, die XML-Werte hat, sollte nicht sein static Müll gesammelt werden (read more about roots)

  • Versuchen zu verwenden kompakte GCSettings.LargeObjectHeapCompactionMode.

    GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect();

Dies wird das Large Object Heap komprimieren, wenn die nächsten Full Garbage Collection ausgeführt wird. Mit GC.Collect() Aufruf nach den Einstellungen wurde der GC sofort kompaktiert.

  • Try WeakReference zu verwenden:

    WeakReference w = new WeakReference(MyLargeObject); MyLargeObject = w.Target as MyLargeClass;

    MyLargeClass MyLargeObject;
    if ((w == null) || ((MyLargeObject=w.Target as MyLargeClass) == null)) { MyLargeObject = new MyLargeClass(); w = new WeakReference(MyLargeObject); }

Dieser Artikel gibt, ist sehr nützlich, um Sie über Garbage Collection und der Artikel wird in einfachem Englisch geschrieben.

+0

Dies war das letzte, was ich versuchte, der Speicher wird freigegeben, aber es beeinträchtigt die Leistung. –

+0

@SudheeshP versuchen, 'WeakReference' zu ​​verwenden. Bitte, siehe meinen aktualisierten Abschnitt – StepUp