2012-03-03 15 views
21

Me pregunto cuáles son las situaciones exactas que activan Full Garbage Collection en Java.¿Qué desencadena una recolección de basura completa en Java?

Los más obvios son:

  • Se ha acabado la vieja generación
  • Se ha acabado la ondulación permanente Gen
  • Calling System.gc()

¿Qué pasa con otros casos que causan completa gc? Particularmente:

  • No hay suficiente espacio libre en Survivor Space para copiar objetos del Eden.
  • Colecciones secundarias que no pueden hacer frente a la tasa de asignación de objetos nuevos (no sé cómo).

Estoy ejecutando Sun Java 1.6 y utilizando Concurrent Mark-Sweep y ParNew para la nueva generación.

+0

Como sugiere Chin Boon, ninguno de esos "obvios" necesariamente conducirá a un GC completo, depende completamente de cómo funciona el algoritmo del recolector de basura activo. En particular, tengo entendido que muchos recolectores de basura ignoran más o menos 'System.gc()'. (Y no olvide que incluso es posible que un algoritmo GC ni siquiera tenga un concepto de "colección completa"; esto puede sonar exagerado, pero no he visto el [recopilador G1] (http: // www). .oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html) hazlo en nuestras aplicaciones.) –

+0

¿Qué crees que hace JVM con G1 cuando se queda sin espacio en el montón? Seguir asignando? Tiene que detener todo hasta que pueda liberar memoria. Hay un interruptor que desactiva explícitamente la sugerencia de System.gc(), pero no he visto que CMS o G1 lo ignoren por defecto. –

+0

Supongo que depende de cómo se defina "colección completa": no creo que sea un término de primera clase en el contexto de las especificaciones de JLS o VM. El significado variará dependiendo del algoritmo particular de GC que está ejecutando, y puede que ni siquiera tenga sentido para un determinado impl GC. Lo que estaba tratando de señalar es que la única respuesta general posible es "depende", con todos los demás detalles diferidos a las partes internas del recolector de basura en particular. –

Respuesta

4

que he observado una mayor situación que desencadena un GC completa en Java HotSpot VM 1.6 de 64 bits en Ubuntu, usando concurrente de marca y barrido:

Si -XX: PermSize valor no es igual a -XX: MaxPermSize (por ejemplo, es más pequeño), ocasionalmente ocurre un GC completo cuando Java necesita expandir el PermGen (aunque no necesita asignar más memoria que MaxPermSize). Así que configurar -XX: PermSize y -XX: MaxPermSize para ser el mismo parece una buena idea.

+0

¿Cómo es esta una respuesta aceptada? PermGenSpace no tiene ningún impacto en full gc. ¿QUIERES decir los parámetros xmx y xms? – Amareswar

+0

@Amareswar Oracle dice: "La generación permanente está incluida en una colección completa de basura" – Gamby

2

Esto depende en gran medida de las opciones de su jvm y del jvm que utilice.

Por esta razón, le recomiendo que consulte el libro "Java Performance" bý John and Hunt.

+1

Tiene que haber algunas reglas generales aunque al menos por implementación de JVM y recolector de basura. –

Cuestiones relacionadas