2010-08-20 3 views
6

Wir haben eine unserer Anwendungen von Java 1.4 auf Java 6.Garbage Collection-Änderung von Java 1.4 zu Java 6?

Bei einigen Last & Performance-Tests beobachteten wir, dass verfügbare Speicher im allgemeinen blieb bei wesentlich geringeren Mengen in Java 6 als auf das, was es vor kurzem ein Upgrade verwendet mit Java 1.4.

Nach einigen Profilerstellung in der App mit Java 6, haben wir festgestellt, dass viele Objekte nicht mehr durch andere Objekte referenziert (d. H. Kandidaten für Garbage Collection) im Speicher blieben und anscheinend nie Müll gesammelt wurden. Wir haben das als Erklärung für das niedrigere verfügbare Gedächtnis genommen.

Frage ist: Hat sich die Art und Weise verändert Garbage Collection von Java 1.4 zu Java 6 geändert?

+6

Ich denke, es ist sicher anzunehmen, dass * alle * Teile der JVM, einschließlich der GC, in all den Jahren verbessert ... delnan

+1

Sind Sie sicher, dass die Objekte echte Kandidaten für die Sammlung sind? Werden sie gesammelt, wenn Sie eine Sammlung über JConsole initiieren? –

+0

Java 7 soll noch mehr 'Optimierungen' auf dem Garbage Collector haben. – Steve

Antwort

15

Hat sich die Vorgehensweise bei der Garbage Collection von Java 1.4 auf Java 6 geändert?

Definitiv!

Java Java 1.4 bis 6 ist ein ziemlich langer Zeitraum (etwa 5 Jahre zwischen den initialreleases und mehr als 8 Jahren zwischen den initial 1.4 release und the current Java 6 release nach this wiki article).

Viele Änderungen und Optimierungen werden in dieser Zeit angewendet und Sie sollten sich nicht wirklich darum kümmern, solange Ihr Programm noch funktioniert.

Wenn Sie mehr Speicher verwenden, bedeutet dies, dass die JVM keine Zeit mit der Garbage Collection verschwendet, wenn dies nicht erforderlich ist. Wenn Sie möchten, dass weniger Speicher belegt wird, sollten Sie den maximalen Heap verkleinern (oder die JVM-Parameter anders anpassen; this article erklärt, wie dies in Java 5 zu tun ist, viele der Ratschläge sind immer noch anwendbar).

Es ist etwas anders, wenn Sie tatsächlich OutOfMemoryError erhalten, die Sie zuvor nicht erhalten haben. Dann sollten Sie überprüfen, wie Sie schwache und weiche Referenzen verwenden oder als letzten Ausweg versuchen, herauszufinden, ob Sie einen JVM-Fehler haben.

3

Java SE viel in 8 Jahren verändert.

In Bezug auf den Garbage Collector wurde es sehr verbessert mit Java SE 6. In Java SE 6 Update 14 wurde der neue Garbage First GC eingeführt.

+0

Während G1 mit Releases> = u14 ausgeliefert wird, ist es in keiner Java 6-Version standardmäßig aktiviert, soweit ich weiß. –

+0

Es ist nicht, Sie müssen es mit '-XX aktivieren: + UnlockExperimentalVMOptions -XX: + UseG1GC' –

+0

HEBERT: nur bereit sein für einige segfaults und Abstürze der VM, es sei denn, Sie verwenden G1 mit Java 7. –