¿Cuándo System.gc() hace algo?

Resuelto asked hace 16 años • 0 respuestas

Sé que la recolección de basura está automatizada en Java. Pero entendí que si llama System.gc()a su código, la JVM puede decidir o no realizar la recolección de basura en ese punto. ¿Cómo funciona esto precisamente? ¿Sobre qué base/parámetros exactamente la JVM decide hacer (o no hacer) un GC cuando ve System.gc()?

¿Hay algún ejemplo en cuyo caso sea una buena idea incluir esto en su código?

 avatar Sep 16 '08 03:09
Aceptado

En la práctica, normalmente decide realizar una recolección de basura. La respuesta varía dependiendo de muchos factores, como en qué JVM estás ejecutando, en qué modo está y qué algoritmo de recolección de basura está usando.

No dependería de ello en su código. Si la JVM está a punto de generar un OutOfMemoryError, llamar a System.gc() no lo detendrá, porque el recolector de basura intentará liberar todo lo que pueda antes de llegar a ese extremo. La única vez que lo he visto usado en la práctica es en IDE donde está adjunto a un botón en el que un usuario puede hacer clic, pero incluso allí no es muy útil.

jodonnell avatar Sep 15 '2008 20:09 jodonnell

El único ejemplo que se me ocurre en el que tiene sentido llamar a System.gc() es cuando se perfila una aplicación para buscar posibles pérdidas de memoria. Creo que los perfiladores llaman a este método justo antes de tomar una instantánea de la memoria.

Guillermo Vasconcelos avatar Sep 15 '2008 20:09 Guillermo Vasconcelos

No tienes control sobre GC en Java: la VM decide. Nunca me he encontrado con un caso en el que System.gc()sea necesario . Dado que una System.gc()llamada simplemente SUGIERE que la VM realice una recolección de basura y también realice una recolección de basura COMPLETA (generaciones antiguas y nuevas en un montón multigeneracional), en realidad puede provocar que se consuman MÁS ciclos de CPU de los necesarios.

En algunos casos, puede tener sentido sugerirle a la máquina virtual que realice una recopilación completa AHORA, ya que es posible que sepa que la aplicación estará inactiva durante los próximos minutos antes de que se produzca un trabajo pesado. Por ejemplo, justo después de la inicialización de una gran cantidad de objetos temporales durante el inicio de la aplicación (es decir, simplemente almacené en caché una TONELADA de información y sé que no obtendré mucha actividad durante aproximadamente un minuto). Piense en un IDE como el inicio de eclipse: hace mucho para inicializarse, por lo que tal vez inmediatamente después de la inicialización tenga sentido hacer un gc completo en ese punto.

DustinB avatar Sep 15 '2008 20:09 DustinB