Java - Cantidad objetos elegibles Garbage Collector

 
Vista:
sin imagen de perfil

Cantidad objetos elegibles Garbage Collector

Publicado por jesus (2 intervenciones) el 13/12/2019 07:49:36
Hola,

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Bla {
 int b;
 
  public static void main(String[] args){
     Bla b;
     for(int i=0; i<10; i++){
        b = new Bla();
         b.b = 10;
      }
      System.out.println("end"); // A
  }
 
}

El código anterior lo vi como ejemplo en ella preguntaban en la linea "A" cuantos objetos elegibles para el garbage collector hay y daban como respuesta "9", explicaban que al salir del for se habrán creado 10 objetos del tipo "Bla" y que solo el ultimo estará referenciado por la variable "b" y que los 9 que quedan sin referencia son los elegibles , mi duda es si este ultimo objeto que aunque esta referenciado por la variable "b" al salir del FOR acaso también no se volverá inaccesible por lo que en lugar de 9 seria 10 la respuesta.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Cantidad objetos elegibles Garbage Collector

Publicado por Juan (70 intervenciones) el 13/12/2019 09:46:52
Hola Jesus, yo no sabia que se decía objetos elegibles y referenciados, está bien saberlo jeje.

Bla b; ---> Esta línea te crea una variable para almacenar objetos de tipo Bla, pero ahora mismo no tiene ningún objeto, es decir no tiene referencia hacia ningún objeto.

b = new Bla(); -------> Esta línea es la que le asigna la referencia a un nuevo objeto Bla.

b.b = 10; ---------> Esta simplemente accedes a ese objeto con la variable b para modificar la variable dentro de este también llamada b, pero esta otra almacena int y no objetos.

cuando entras por segunda vez en el ciclo esta línea:

b = new Bla(); ----> Vuelve a asignarle una referencia a la variable b, hacia un nuevo objeto. pero la variable b ya tenia referencia a un objeto anteriormente, que sucede con el objeto anterior? este objeto pasa a elegible, es decir el recolector de basura se lo lleva y no puedes acceder a el nunca más.

y asi cada vez que ejecutas el for.

cuando sales del for, el último objeto creado en el for continúa teniendo la referencia en la variable b. puesto que no le has asignado una nueva referencia a esta variable. y a través de esta variables podrías acceder a este último objeto y modificar sus datos. por lo tanto el último objeto no pasa a elegible, el recolector de basura no lo elimina porque aún tiene una referencia desde la que puedes acceder a este objeto. para que se pierda esta referencia fuera del for habría que asignarle otro objeto a la variable b o ponerla en null es decir

b = null;

con esto la variable b ya no almacenaria ningún objeto, y ese último objeto que tenía guardado también se perdería en el recolector de basura, pero al no hacer esto en tu ejemplo, la variable b sigue guardando el último objeto, y es por eso que la respuesta es 9, porque has perdido el acceso a 9 objetos. pero al ultimo todavia tienes acceso. No se si me explique y te aclare algo jeje.


otra cosa, es que si se hubiese declarado la variable Bla b, dentro del for, esta si se hubiese perdido al salir del for, pero al estar fuera, esta no se pierde y sigue manteniendo su ultimo objeto referenciado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cantidad objetos elegibles Garbage Collector

Publicado por jesus (2 intervenciones) el 13/12/2019 17:33:06
Hola juan gracias por responder, entiendo lo que comentas , ahora me doy cuenta que afuera del FOR podrías acceder al objeto creado ejm: System.out.println(b.b); .Pero haría falta en el ejm inicializarlo Bla b = null ; por que si no marcaría error de compilación . Sabiendo este detalle la respuesta seguiría siendo 9 ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Cantidad objetos elegibles Garbage Collector

Publicado por Juan (70 intervenciones) el 13/12/2019 22:32:37
Hola Jesus, si la respuesta sigue siendo 9. Lo que pasa es que al colocar System.out.println(b.b) fuera del "For", te pide que le des un valor inicial a esa variable, porque si por cualquier razón no se ejecuta el "For" (que es donde se le da el valor a la variable b) esta variable no tendrá ningún valor y producirá un error en el System.out.prinln() por eso te obliga a darle un valor inicial, para prevenir esto. pero la ejecución es la misma y al final te quedarán 9 objetos elegibles.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Cantidad objetos elegibles Garbage Collector

Publicado por Rodrigo (623 intervenciones) el 14/12/2019 04:40:45
Las variables locales siempre tienen que tener un valor asignado antes de usar el valor que ellas tienen.
Si hay print se requiere alguna asignacion antes (valido para variables locales)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar