Requisito previo: recolección de basura en Java
Nivel de dificultad: Intermedio En Java, el módulo Garbage Collector
se encarga de la destrucción de objetos y los objetos que no tienen ninguna referencia a ellos son elegibles para la recolección de basura. A continuación se presentan algunas preguntas de salida importantes sobre la recolección de basura. Prediga la salida de los siguientes programas Java:
- Programa 1:
public
class
Test
{
public
static
void
main(String[] args)
throws
InterruptedException
{
String str =
new
String(
"GeeksForGeeks"
);
// making str eligible for gc
str =
null
;
// calling garbage collector
System.gc();
// waiting for gc to complete
Thread.sleep(
1000
);
System.out.println(
"end of main"
);
}
@Override
protected
void
finalize()
{
System.out.println(
"finalize method called"
);
}
}
Producción:
end of main
Explicación: sabemos que Garbage Collector llama al método finalize() en un objeto antes de destruirlo. Pero aquí, el truco es que str es un objeto de clase String, no la clase Test. Por lo tanto, el método finalize() de la clase String (si se anula en la clase String) se llama en str. Si una clase no anula el método de finalización, entonces, por defecto, se llama al método finalize() de la clase Object.
- Programa 2:
public
class
Test
{
public
static
void
main(String[] args)
throws
InterruptedException
{
Test t =
new
Test();
// making t eligible for garbage collection
t =
null
;
// calling garbage collector
System.gc();
// waiting for gc to complete
Thread.sleep(
1000
);
System.out.println(
"end main"
);
}
@Override
protected
void
finalize()
{
System.out.println(
"finalize method called"
);
System.out.println(
10
/
0
);
}
}
Producción:
finalize method called end main
Explicación:
cuando Garbage Collector llama al método finalize() en un objeto, ignora todas las excepciones generadas en el método y el programa terminará normalmente. - Programa 3:
public
class
Test
{
static
Test t ;
static
int
count =
0
;
public
static
void
main(String[] args)
throws
InterruptedException
{
Test t1 =
new
Test();
// making t1 eligible for garbage collection
t1 =
null
;
// line 12
// calling garbage collector
System.gc();
// line 15
// waiting for gc to complete
Thread.sleep(
1000
);
// making t eligible for garbage collection,
t =
null
;
// line 21
// calling garbage collector
System.gc();
// line 24
// waiting for gc to complete
Thread.sleep(
1000
);
System.out.println(
"finalize method called "
+count+
" times"
);
}
@Override
protected
void
finalize()
{
count++;
t =
this
;
// line 38
}
}
Producción:
finalize method called 1 times
Explicación :
después de la ejecución de la línea 12, t1 se vuelve elegible para la recolección de elementos no utilizados. Entonces, cuando llamamos al recolector de basura en la línea 15, Garbage Collector llamará al método finalize() en t1 antes de destruirlo. Pero en el método de finalización, en la línea 38, nuevamente estamos haciendo referencia al mismo objeto por t, por lo que después de la ejecución de la línea 38, este objeto ya no es elegible para la recolección de elementos no utilizados. Por lo tanto, Garbage Collector no destruirá el objeto.Ahora nuevamente en la línea 21, estamos haciendo que el mismo objeto sea elegible para la recolección de basura una vez más. Aquí, tenemos que aclarar un hecho sobre Garbage Collector, es decir, llamará al método finalize() en un objeto en particular exactamente una vez. Dado que en este objeto, ya se ha llamado al método finalize(), ahora Garbage Collector lo destruirá sin volver a llamar al método finalize().
- Programa 4:
public
class
Test
{
public
static
void
main(String[] args)
{
// How many objects are eligible for
// garbage collection after this line?
m1();
// Line 5
}
static
void
m1()
{
Test t1 =
new
Test();
Test t2 =
new
Test();
}
}
Pregunta:
¿Cuántos objetos son elegibles para la recolección de elementos no utilizados después de la ejecución de la línea 5?
Responder :2
Explicación:
dado que t1 y t2 son objetos locales del método m1(), se vuelven elegibles para la recolección de basura después de la ejecución completa del método, a menos que se devuelva alguno de ellos. - Programa 5:
public
class
Test
{
public
static
void
main(String [] args)
{
Test t1 =
new
Test();
Test t2 = m1(t1);
// line 6
Test t3 =
new
Test();
t2 = t3;
// line 8
}
static
Test m1(Test temp)
{
temp =
new
Test();
return
temp;
}
}
Pregunta:
¿Cuántos objetos son elegibles para la recolección de basura después de la ejecución de la línea 8?
Responder :1
Explicación:
en el momento en que se ejecutó la línea 8, el único objeto sin referencia es el generado, es decir, como resultado de la línea 6. Recuerde que » Java se pasa estrictamente por valor «, por lo que la variable de referencia t1 no se ve afectada por m1( ) método. Podemos verificarlo usando el método finalize(). La declaración «System.out.println(this.hashcode())» en el método finalize() imprime el valor del código hash del objeto en el que se llama al método finalize(), y luego simplemente compara el valor con los valores del código hash de otros objetos creados en el método principal .
Este artículo es una contribución de Gaurav Miglani . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA