Questao Garbage Collector

6 respostas
S

Quantos objetos serão elegíveis para o Garbage Collector na linha 12??

class A{ A a; public A(A a){ this.a=a; } public static void main(String args[]){ A a1=null; A a2=new A(new A(null)); A a3=new A(a2); a1=a3; a1.a=new A(null); a2.a=null; //Line12 System.gc(); } }

Eu respondi “mais de 3”, pq contei todos os “Objeto.a” que receberam valor null mas a resposta certa é “1”.
Não entendi!!
As variáveis de referência que receberam null na construção dos objetos não ficarão elegíveis, porque ??
Então, único objeto que será elegivel é “a2.a”???

Help me please!!! :roll:

6 Respostas

GabrielCardelli

tambem to com essa duvida nas minhas contas foram 2.

Anderson_Schmidt

Concordo com a resposta do livro, 1 é correto mesmo.

Quais as referências não nulas, tirando “a2.a=null;” ??

B

O único objeto elegiado ao GC é o que está referenciado por “a2.a”. Após essas duas linhas aqui:

1. class A{ A a; public A(A a){ this.a=a; } public static void main(String args[]){ A a1=null; A a2=new A(new A(null)); A a3=new A(a2); a1=a3; a1.a=new A(null); //aqui "a1.a" modifica a variável "a3.a", q perde a referencia ao objeto "a2" a2.a=null; //Line12 //aqui, faz a variavel "a2.a" perder a referencia ao seu objeto, portanto o objeto de "a2.a" será elegido, mas não o de "a2", q ainda tem referencia. System.gc(); } }

Você não pode considerar dessa maneira, pois quando passa “null”, vc está atribuindo este valor a uma variável “a” que não faz referência a nenhum objeto, ou seja, elas ainda não foram inicializadas. Não há perda de referência de nenhum objeto ao passar “null” a essas variáveis antes de ser atribuído um valor a elas.

Espero q tenha ficado claro.

Lavieri

vamo la davagarinho...

//linha 7  ---> A a1=null;

a1 = null

listaParaColetaDeLixo = {}
//linha 8  ---> A a2=new A(new A(null));

a1 = null
a2 = obj1 //<== criado
obj1.a = obj2 //<== criado obj2 e ajustado para obj1.a no construtor de obj1
obj2.a = null //<== ajustado no construtor

listaParaColetaDeLixo = {}
//linha 9  ---> A a3=new A(a2);  

a1 = null
a2 = obj1
a3 = obj3 //<== criado
obj1.a = obj2
obj2.a = null
obj3.a = obj1 //<== ajustado no construtor

listaParaColetaDeLixo = {}
//linha 10 ---> a1=a3; 

a1 = obj3 //<== alterado
a2 = obj1
a3 = obj3 
obj1.a = obj2
obj2.a = null
obj3.a = obj1

listaParaColetaDeLixo = {}
//linha 11 ---> a1.a=new A(null); 

a1 = obj3
a2 = obj1
a3 = obj3
obj1.a = obj2
obj2.a = null
obj3.a = obj4 //<== criado obj4, e setado a obj3.a
obj4.a = null //<== ajustado no construtor 

listaParaColetaDeLixo = {}
//linha 12 ---> a2.a=null;

a1 = obj3
a2 = obj1
a3 = obj3
obj1.a = null //<== alteração
obj3.a = obj4
obj4.a = null

listaParaColetaDeLixo = {obj2} //obj1.a perdeu a referencia a obj2

Portanto... na linha 12... ninguem mais referencia o objeto 2 ... e só ele esta elegivel para a coleta

e como vc pode ver... a1 e a3 referencia obj3 ... a2 referencia obj1 ... obj3.a referencia obj4 .... portanto obj1,obj3 e obj4 não são elegiveis para a coleta

S

Acho que eu estava pensando ao contrario, distorcendo o conceito! eu não tenho que contar quantas variaveis de referencia ficaram nulas e sim quantos objetos existem e não estão sendo referenciados por ninguem!!

Agora ficou mais claro!

Ah, adorei esse passo a passo, é um teste de mesa mais descritivo, oq eu fiz só estava me confundindo mais.rs vai me ajudar a resolver esse tipo de questão no meu exame (28/05 …ta chegando :shock: )

Agora entendi, muito obrigada a todos!

deyvid

É verdade! a resposta é a2.a. Não responder porque a questão já foi respondida pelos nossos colegas. Muito boa essa questão

Criado 23 de maio de 2009
Ultima resposta 25 de mai. de 2009
Respostas 6
Participantes 6