2010-08-20 14 views
6

Recentemente abbiamo aggiornato una delle nostre applicazioni da Java 1.4 per Java 6.Modifica della garbage collection da Java 1.4 a Java 6?

Con alcuni test di performance carico &, abbiamo osservato che la memoria a disposizione rimase in generale a livelli molto più bassi in Java 6 rispetto a quello che ha usato per essere con Java 1.4.

Dopo aver effettuato alcuni profili sull'app con Java 6, abbiamo notato che molti oggetti non più referenziati da altri oggetti (cioè i candidati per la garbage collection) sono rimasti in memoria e apparentemente non sono mai stati raccolti. L'abbiamo preso come spiegazione per la memoria disponibile inferiore.

La domanda è: il modo in cui la raccolta di dati inutili si comporta è cambiato da Java 1.4 a Java 6?

+6

Penso che sia il caso di presumere che * tutte * le parti della JVM, incluso il GC, siano migliorate durante tutti questi anni ... delnan

+1

Sei sicuro che gli oggetti siano veri candidati per la raccolta? Vengono raccolti se si avvia una raccolta tramite JConsole? –

+0

Java 7 è pensato per avere ancora più "ottimizzazioni" sul garbage collector. – Steve

risposta

15

ha comportato il modo in cui la raccolta di dati inutili si modifica da Java 1.4 a Java 6?

Definitivamente!

Java 1.4 per Java 6 è una piuttosto lunga periodo (quasi 5 anni tra le initialreleases e più di 8 anni tra il initial 1.4 release e the current Java 6 release, secondo this wiki article).

Molte modifiche e ottimizzazioni vengono applicate in quel momento e non dovresti preoccuparti se il tuo programma funziona ancora.

Avere memoria più utilizzata significa solo che la JVM non perde tempo con la garbage collection quando non è necessario. Se si desidera utilizzare meno memoria, è necessario ridurre l'heap massimo (o altrimenti modificare i parametri JVM: this article spiega come farlo in Java 5, gran parte del consiglio è ancora applicabile).

È leggermente diverso se si ottiene effettivamente OutOfMemoryError che non è stato possibile ottenere in precedenza. Quindi dovresti controllare come usi i riferimenti deboli e molli o come ultima risorsa per scoprire se riscontri un baco JVM.

3

Java SE cambiato molto in 8 anni.

Per quanto riguarda il garbage collector, è stato migliorato molto con Java SE 6. In Java SE 6 Update 14 è stato introdotto il nuovo GC Garbage First.

+0

Mentre G1 viene fornito con versioni> = u14, non è abilitato di default in nessuna versione di Java 6, per quanto ne so. –

+0

Non lo è, devi attivarlo con '-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC' –

+0

HEBERT: preparati solo per alcuni problemi di segfault e crash della VM, a meno che tu non stia utilizzando G1 con Java 7. –