2009-07-16 5 views
2

Ich arbeite an einer Swing-App. Ich werde Erfahrung Langsamkeit nach einer halben Stunde dauern.Kann ich erkennen, wenn der Garbage Collector funktioniert?

kann es wegen GC laufen?

Wie kann ich finden, wenn der Garbage Collector durch eine beliebige jdk 1.5 Kommandozeilenoption läuft?

Dank

+1

Das sieht aus wie Symptome von Speicherverlust (die in Java schwer zu verfolgen ist) – Chii

Antwort

6

Sie jconsole.exe verwenden können, die in dem Verzeichnis ist Ihre jdk gefunden werden können. Es zeigt Ihnen viele Details über Ihre laufende JVM.

+1

+1 für jconsole. Sie sehen eine Sägezahnkurve der Speichernutzung, die anzeigt, wann der GC eintritt. Sie können sogar einen manuellen GC auslösen, wenn Sie möchten. Ich bezweifle jedoch, dass Sie finden, dass dies GC ist. –

8

Wenn Sie Java mit -XX: + PrintGC starten, wird es Nachrichten immer dann drucken, wenn es Müll sammelt.

+0

und -XX: + PrintGCDetails –

4

Es ist sehr unwahrscheinlich, dass der GC zu beobachtbaren Problemen führt. Es war einmal, dass Java einen schrecklich langsamen GC hatte, der ihm einen fast permanenten schlechten Ruf verschaffte. Diese Zeit ist vorbei.

Was genau ist die Langsamkeit? Ein GC sollte wirklich nie mehr als einen Bruchteil einer Sekunde dauern, selbst für den seltenen vollständigen Sammelpass.

Edit: Auch wenn der GC ist läuft eine messbare Menge, es ist wahrscheinlich nur ein Symptom für das Problem. Welcher Code den GC so stark beansprucht, würde intern zu mehr Langsamkeit führen als der GC.

+1

Dies gilt nur für kleine Anwendungen, was hier der Fall sein kann. Sobald Sie die Speichernutzung erhöhen, kann GC leicht zum Problem werden.In den meisten Fällen handelt es sich mehr um die Anzahl der Garbage Collections als um die Zeit, die ein einzelner GC benötigt. – jens

+1

Wenn du klein meinst weniger als * ein Konzert oder zwei *, dann vielleicht? –

2

Ich bezweifle stark, dass es der GC ist, den Sie sehen. Wie 280Z28 herausstellt, läuft der GC normalerweise ziemlich schnell (obwohl Leistung immer noch töten kann, wenn Sie etwas falsch machen). Benutzt du das Programm in dieser Zeit? Wenn nicht, hast du vielleicht ein wenig Speicher und es wurde ausgelagert? (Wenn ich Eclipse länger als einen halben Tag laufen lasse, ohne es zu benutzen, kann ich damit nicht mehr arbeiten. Auf Systemen mit wenig Speicher kann es früher passieren.)

2

Die einfachste Möglichkeit, dies zu untersuchen, wenn Sie das neueste JDK verwenden, ist jvisualvm, mit dem Sie an einen laufenden Prozess anhängen können. Sie können dann Speicherbereinigungen, Speichernutzung und Profil anzeigen, falls erforderlich. (Es ist im Wesentlichen die entsprechende NetBeans-Funktionalität, die als eigenständige Anwendung im JDK verfügbar ist).

Es ergänzt und verbessert jconsole!

(Aber was Sie von einem Speicherverlust in Ihrem Programm führte zu einer übermäßigen GC sein beschreiben kann. Verwenden Sie jvisualvm, um herauszufinden)

+0

+1 für jvisualvm, was erstaunlich ist, Speicherlecks zu finden. – Zarkonnen

1

GC selbst wahrscheinlich nicht das Problem ist. Wenn Sie jedoch ein Speicherleck haben, kann GC dazu führen, dass die gesamte CPU versucht, Speicher zu löschen.

0

Wie alle bereits erwähnt haben, ist GC mit ziemlicher Sicherheit nicht das Problem.

Ich würde etwas wie YJP (Ihr Java Profiler, kostenlos für 30 Tage) versuchen, um Ihre Anwendung zu profilieren und herauszufinden, was langsamer ist. Ein Speicherleck ist eine sehr mögliche Ursache.