Duvida sobre GC

Oi pessoal,
Alguém pode me explicar porque a resposta a essa questão é a alinea D) e não a B) ?

Given: 
1. class Bar { } 
1. class Test { 
2. Bar doBar() { 
3. Bar b = new Bar(); 
4. return b; 
5. } 
6. public static void main (String args[]) { 
7. Test t = new Test(); 
8. Bar newBar = t.doBar(); 
9. System.out.println("newBar"); 
10. newBar = new Bar(); 
11. System.out.println("finishing"); 
12. } 
13. } 
At what point is the Bar object, created on line 3, eligible for garbage collection? 
A. After line 8.
B. After line 10.
C. After line 4, when doBar() completes.
D. After line 11, when main() completes.

Acho que tem uma pegadinha ai…
O fato é que a questão pergunta sobre o objeto newbar, só que a referência do mesmo passa a referenciar um novo objeto Bar na linha 10… O objeto retornado por t.doBar() neste ponto passa a ser elegível para GB, porém como newbar ainda referencia um objeto válido, este não é elegível… só quando o main acaba mesmo. Eu entendi isso :slight_smile:

O que eu acho é que o objecto retornado por t.doBar() nunca mais vai ser acessivel, porque ninguém mais aponta para ele, por isso é elegivel para ser colectado.

Acho que não sem sentido o objecto não ser colectado porque quem apontava para ele ainda aponta para alguém válido. O que interessa é que o objecto não pode mais ser acessado por ninguém… acho eu! :slight_smile:

[quote=amussa]
Acho que não sem sentido o objecto não ser colectado porque quem apontava para ele ainda aponta para alguém válido. O que interessa é que o objecto não pode mais ser acessado por ninguém… acho eu! :-)[/quote]

Com certeza no momento que a variavel newBar aponta para o novo objeto, o que foi criado na linha 3 fica qualificado para coleta.

com essa alteraçao da para ter certeza:

class Bar { static int count; int id; Bar (){ id = ++count; // isso prova que count recebeu o valor padrao :) } protected void finalize() { System.out.println("Bar " + id + " coletado "); } } class Test { Bar doBar() { Bar b = new Bar(); return b; } public static void main (String args[]) { Test t = new Test(); Bar newBar = t.doBar(); System.out.println("newBar"); newBar = new Bar(); System.gc(); System.out.println(newBar.id); System.out.println("finishing"); } }

Isso não se deve ao fato de o objeto criado na linha 3,ficar “perdido”,pois a sua unica referência mudou de objeto.Quer dizer,ele agora aponta para outro objeto,então nenhum objeto mais aponta para aquele OBJETO criado.
Acho que você deve ter feito confusão com aquela questão do escopo da variavel que é criada dentro do método,mas…a regra não é a mesma para objetos.Pois objetos,são referências…na verdade,tudo em java é passado por valor,mas…isso são outros quinhentos.