dúvida de garbage collector

já falaram algo parecido no forum mas eu não entendi…

Object o1 = new Object();

Object o2 = o1;

o1 = null;

o2 = null;

Quando o objeto “o1” fica pronto para ser coletado?
ao fazer “o1 = null” ou “o2 = null” ???

disseram que é ao fazer o2 = null, porque só ai vc está matando a referência criada com o operador new…

mas se vc faz “o1 = null” porque não é nessa linha?

Vc cria um objeto:

Object o1 = new Object();

Depois vc cria uma outra referência apontado para o mesmo objeto:

Object o2 = o1;
(a tradução disso é: o2, aponte para o mesmo lugar que o1 está apontando)

Nesse momento, vc tem duas referências apontando para o mesmo objeto. Se aqui vc faz…

o1 = null;

… vc ainda mantém uma referência apontando para o objeto, que é o2. Ou seja, o objeto ainda não está pronto para ser coletado! Isso só vai acontecer depois que vc fizer…

o2 = null;

Blz?

Imagina assim:

Object o1 = new Object();

-com o new, um novo objeto o1 é criado no endereço 10
-o1 aponta para endereço 10
(temos> o1->10)

Object o2 = o1;

-o2 aponta para o mesmo endereço de o1 (endereço 10)
(temos o1->10 e o2->10)

o1 = null;
-removida a referência de o1
(temos o1->null e o2->10)

o2 = null;
-removida a referência de o2
(temos o1->null e o2->null)

legal…
mas isso não quer dizer que assim que vc declarar o2 como null,
ele vai ser imediatamente coletado, quem decide isso é a JVM, certo?

Sim, NUNCA se sabe exatamente quando o GC vai rodar.