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.
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.) –
¿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. –
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. –