2010-08-20 14 views
6

Recientemente hemos actualizado una de nuestras aplicaciones de Java 1.4 a Java 6.¿Cambios en la recolección de basura de Java 1.4 a Java 6?

Con algunas pruebas de rendimiento de carga &, se observó que la memoria disponible se mantuvo, en general, en niveles mucho más bajos en Java 6 que en lo que solía ser con Java 1.4.

Después de realizar algunos perfiles en la aplicación con Java 6, notamos que muchos objetos a los que ya no hace referencia ningún otro objeto (es decir, candidatos para la recolección de basura) permanecían en la memoria y aparentemente nunca se recolectaban. Tomamos eso como la explicación para la memoria disponible más baja.

La pregunta es: ¿se comportó la forma en que la recolección de basura se modificó de Java 1.4 a Java 6?

+6

Creo que es seguro suponer que * todas * partes de la JVM, incluido el GC, mejoraron durante todos esos años ... delnan

+1

¿Estás seguro de que los objetos son candidatos genuinos para la recopilación? ¿Se recopilan si inicia una recopilación a través de JConsole? –

+0

Java 7 está destinado a tener aún más 'optimizaciones' en el recolector de basura. – Steve

Respuesta

15

¿Se comportó de la forma en que la recolección de basura se modificó de Java 1.4 a Java 6?

¡Definitivamente!

Java 1.4 a Java 6 es un intervalo de tiempo bastante largo (casi 5 años entre las initialreleases y más de 8 años entre el initial 1.4 release y the current Java 6 release, de acuerdo con this wiki article).

Muchos cambios y optimizaciones se aplican en ese momento y no debería preocuparse realmente mientras su programa aún funcione.

Tener más memoria utilizada solo significa que la JVM no pierde el tiempo con la recolección de basura cuando no es necesario. Si desea que use menos memoria, entonces debe reducir el montón máximo (o ajustar los parámetros de JVM; this article explica cómo hacerlo en Java 5, gran parte de los consejos sigue siendo aplicable).

Es algo diferente si realmente obtienes OutOfMemoryError que no obtuviste previamente. Luego debe verificar cómo utiliza referencias débiles y débiles o, como último recurso, intente averiguar si acierta con un error de JVM.

3

Java SE cambiado mucho en 8 años.

En cuanto al recolector de basura, se ha mejorado mucho con Java SE 6. En Java SE 6 Update 14, se introdujo el nuevo Garbage First GC.

+0

Mientras que G1 se envía con releases> = u14, no está habilitado por defecto en ninguna versión de Java 6, hasta donde yo sé. –

+0

No es así, tienes que activarlo con '-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC' –

+0

HEBERT: solo prepárate para algunos segfaults y bloqueos de la máquina virtual, a menos que estés usando G1 con Java 7. –

Cuestiones relacionadas