2012-09-22 7 views
14

Ich habe erhebliche Garbage Collection Pausen. Ich möchte die Objekte, die am meisten für diese Sammlung verantwortlich sind, genau bestimmen, bevor ich versuche, das Problem zu beheben. Ich habe mir den Heap-Snapshot in Chrome angeschaut, aber (korrigiere mich, wenn ich falsch liege) Ich kann keinen Hinweis darauf finden, was gesammelt wird, sondern nur, was am meisten Speicherplatz benötigt. Gibt es eine Möglichkeit, dies empirisch zu beantworten, oder bin ich auf fundierte Vermutungen beschränkt?Wie kann ich feststellen, welche Objekte vom Garbage Collector erfasst werden?

+2

Wie Sie sicher sein können, dass die Pausen entstehen durch Müllabfuhr? – pencil

+0

Hast du das gelesen? http://gent.ilcore.com/2011/08/finding-memory-leaks.html?m=1 – HerrSerker

+1

@pencil Zwei Möglichkeiten - sie fallen mit dem Speicherverlust auf der Speicher-Timeline in Chrome zusammen, und wenn ich das erzwinge Code, um die Pausen ständig zu wiederholen, ist die Garbage-Collection (bei weitem) der zeitaufwendigste Teil meiner Profilergebnisse. – shino

Antwort

3

Wenn Sie versuchen, zwischen ein paar wahrscheinlichen Täter zu wählen, könnten Sie die Objektdefinition ändern, um sich an den globalen Bereich anzuhängen (als Liste unter Dokument oder etwas). Dann wird dies verhindern, dass sie gesammelt werden. Das kann das Programm schneller machen (sie werden nicht zurückgewonnen) oder langsamer (weil sie sich aufbauen und jedes Mal vom Mark-and-Sweep überprüft werden). Wenn Sie also eine Leistungsänderung bemerken, haben Sie möglicherweise das Problem gefunden.

Eine Alternative besteht darin, zu prüfen, wie viele Objekte von jedem Typ erstellt werden (richten Sie einen Zähler im Konstruktor ein). Wenn sie viel gesammelt werden, werden sie ebenso häufig erstellt.

+0

Das ist clever! Ich werde es gleich ausprobieren, danke. – shino

9

In Chrom-Profilen dauert zwei Haufen Snapshots, eine vor der Aktion, die Sie überprüfen möchten und eine nach.

Klicken Sie nun auf den zweiten Schnappschuss.

Auf der unteren Leiste sehen Sie die Auswahlbox mit der Option "Zusammenfassung". Ändern Sie es in "Vergleich".

Dann im Auswahlfeld daneben Snapshot auswählen, mit dem verglichen werden soll (es sollte automatisch snapshot1 gewählt werden).

Als Ergebnisse erhalten Sie Tabelle mit Daten, die Sie benötigen, dh. "Neue" und "Gelöschte" Objekte.

5

Bei neueren Chrome veröffentlicht ein neues Werkzeug für diese Art von Aufgabe, die ist praktisch verfügbar:

Der „Record Heapzuweisungen“ Profiltyp. Das reguläre Vergleichs-Tool "Heap SnapShot" (wie in den Antworten von Rafał Łużyński erklärt) kann Ihnen diese Art von Informationen nicht geben, da jedes Mal, wenn Sie einen Heap-Snapshot machen, ein GC-Lauf durchgeführt wird. GCed-Objekte sind also nie Teil der Snapshots. Mit dem Werkzeug "Heapzuweisungen aufzeichnen" werden jedoch ständig alle Zuweisungen aufgezeichnet (daher kann es Ihre Anwendung während der Aufnahme stark verlangsamen). Wenn häufige GC-Läufe auftreten, können Sie mit diesem Tool Orte in Ihrem Code identifizieren, an denen viel Speicher zugeordnet ist. In Verbindung mit dem Heap SnapShot-Vergleich sehen Sie, dass meistens mehr Speicher zwischen zwei Snapshots zugewiesen wird, als Sie aus dem Vergleich sehen können. In extremen Fällen ergibt der Vergleich überhaupt keinen Unterschied, während das Zuweisungswerkzeug Ihnen viel und viel zugewiesenen Speicher anzeigt (was offensichtlich in der Zwischenzeit Müll gesammelt werden musste).

Leider ist die aktuelle Version des Tools nicht angezeigt Sie wo die Zuteilung stattfand, aber es wird Ihnen zeigen, was zugeordnet wurde, und wie wird es zum Zeitpunkt der Zuteilung erhalten. Aus den Daten (und möglicherweise den Konstruktoren) können Sie jedoch Ihre Objekte und damit den Ort, an dem sie zugeordnet werden, identifizieren.

3

Werfen Sie einen Blick auf https://developers.google.com/chrome-developer-tools/docs/heap-profiling

besonders Contain Ansicht

Die Ansicht Contain ist im Wesentlichen eine „Vogelperspektive“ Ihre Objekte Struktur der Anwendung. Es ermöglicht Ihnen, einen Blick in die Funktion Verschlüsse zu werfen, VM interne Objekte zu beobachten, die zusammen Ihre JavaScript-Objekte bilden, und zu verstehen, wie viel Speicher Ihre Anwendung auf einem sehr niedrigen Niveau verwendet.

Die Ansicht bietet mehrere Einstiegspunkte:

DOMWindow Objekte - diese Objekte als "global" betrachtet werden Objekte für JavaScript-Code; GC-Wurzeln - tatsächliche GC-Wurzeln, die von VMs Müll verwendet werden Sammler; Native Objekte - Browser-Objekte, die innerhalb der virtuellen JavaScript-Maschine " " verschoben werden, um eine Automatisierung zu ermöglichen, z. DOM-Knoten, CSS-Regeln (siehe den nächsten Abschnitt für weitere Details.) Im Folgenden finden Sie die Beispiel dafür, was die Eindämmung Ansicht wie folgt aussieht:

enter image description here

+0

Soweit ich weiß, werden Objekte, die als Garbage Collector erfasst werden können, in dieser Ansicht nicht angezeigt, da vor dem Snapshot ein GC-Lauf ausgeführt wurde. Da das OP wissen möchte, welche Objekte bewertet werden, wird dies nicht wirklich helfen, oder? – Sebastian

Verwandte Themen