No se puede aplicar la recolección de basura en Java. Pero aún así, a veces, llamamos al método System.gc () explícitamente. El método System.gc () proporciona solo una «pista» a la JVM de que se debe ejecutar la recolección de basura. ¡No está garantizado!
La documentación de la API para System.gc () establece que «Cuando el control regresa de la llamada al método, la máquina virtual Java ha hecho un gran esfuerzo para recuperar espacio de todos los objetos descartados». La responsabilidad del programador es asegurarse de que no queden referencias para los objetos.
El programa siguiente muestra que la recolección de basura puede ejecutarse después de que se llame a System.gc (). Nuevamente, NO está garantizado.
public class GCTest { public static void main(String[] args) throws InterruptedException { A a = new A("white"); a = null; Runtime.getRuntime().gc(); } } class A { private String color; public A(String color) { this.color = color; } @Override public void finalize() { System.out.println(this.color + " cleaned"); } } |
Por lo tanto, el programa puede generar o no lo siguiente:
white cleaned
El siguiente programa muestra que la recolección de basura funciona automáticamente detrás sin System.gc () llamado.
public class GCTest { public static void main(String[] args) throws InterruptedException { A a = new A("white"); for (int i = 0; i < 10000000; i++) { if (i % 2 == 1) { a = new A("red"); } else { a = new A("green"); } a = null; } } } class A { private String color; public A(String color) { this.color = color; } @Override public void finalize() { System.out.println(this.color + " cleaned"); } } |
Producirá algo como lo siguiente:
... green cleaned green cleaned red cleaned red cleaned green cleaned green cleaned red cleaned red cleaned green cleaned green cleaned red cleaned red cleaned ...