Dúvida na questão de garbage collection

17 respostas
gabrielmelo

Pessoal,

Boiei nessa questão do livro da kathy sobre Garbage Collection. Alguém pode me esclarecer essa dúvida ?

Dado o código:

1. public class X { 2. public static void main(String [] args) { 3. X x = new X(); 4. X x2 = m1(x); 5. X x4 = new X(); 6. x2 = x4; 7. doComplexStuff(); 8. } 9. static X m1(X mx) { 10. mx = new X(); 11. return mx; 12. } 13. }

Depois que a linha 6 for executada, quantos objetos estarão qualificados p/ o garbage collerctor?

A. 0
B. 1
C. 2
D. 3
E. 4

A resposta é a B. :shock:

[]´s

17 Respostas

L

A referência de x2 foi trocada em execução, entã a referência antiga ficou sujeito ao coletor de lixos. apenas com x2 isso acontece…

eltonk

Mas está certa a letra B…

O que acontece é o seguinte:

x recebe a referência de um novo objeto X;
x2 passa a referência de x para m1(), mas m1() descarta essa referência, cria um nvo objeto X, atribui a mx e retorna essa referência. x2 recebe a referencia…
Até aqui temos 2 objetos X
x4 recebe a referência de um novo objeto X; Esse é o terceiro objeto…
x2 recebe referência de x4. Aqui ele perde a referência do antigo objeto, que fica sem pai…
a variável mx não existe mais no stack :slight_smile:

compliquei mais?

marcosbrandao

exatamente…

quando o objeto x2 recebe a referencia do objeto x4
x2 -> x4
ele perde a referencia que aponta para o objeto mx,
entao mx fica sem nenhuma refeerencia apontando para ele.
Agora ele esta sozinho e desamparado e o GC vai vir busca-lo e exterminá-lo:)

nbluis

bah que trajédia…

huiahauihai

gabrielmelo

Obrigado a todos pela explicação.

Elton, não complicou não, ficou bem claro a sua explicação.

Valew.

Tem uma outra questão do livro que eu boiei tambem, quando li a explicação do livro não entendi.

Dado o código a seguir:

12. X3 x2 = new X3(); 13. X3 x3 = new X3(); 14. X3 x5 = x3; 15. x3 = x2; 16. X3 x4 = x3; 17. x2 = null; 18. // insert code

Dois trechos de código, inseridos independente da linha 8, tornarão um objeto qualificado para o garbage collection. Quais(selecione dois)?

A. x3 = null;

B. x4 = null;

C. x5 = null;

D. x3 = x4;

E. x5 = x4;

A resposta é C e D. :shock:

Valew

Omeganosferatu

… relendo capitulo de GC O.o

LPJava

a pegadinha ai ta que o metodo ele retorna um objeto entao quando um metodo retorna um objeto ele nao fica disponivel para coleta… entao vc ai so tem um objeto realmente disponivel ja que depois x2 referencia a outro objeto… :smiley:

gabrielmelo

Opa, coloquei a resposta errada.

Resposta é C e E.

LPJava

puts n sei agora :frowning:

Omeganosferatu

Seguinte tava perdendo um tempo aqui analisando porque fiquei confuso tambem mas a alternativa C esta correta porque X3 nasce referenciando um determinado objeto, dai depois X5 referencia X3, este por sua vez na linha 15 referencia o mesmo objeto que x2. e x4 passa a referenciar x3.

Entao na linha 18 sem código nenhum os objetos sao
x2 —>null
x3 —>testes.TesteMatheus@119c082
x4 —>testes.TesteMatheus@119c082
x5 —>testes.TesteMatheus@1add2dd

Agora fica facil descobrir o porque das alternativas. Se x5 for nulo ou referenciar o mesmo objeto que x3 e x4 ja referenciam, temos um objeto sendo abandonado senhores. E eu nao queria estar no lugar dele porque dizem que esse GarbageCollector tem poderes terríveis O.o

alberto_ribeiro

Cara não sei se vou falar besteira mas tenho que tentar aprender vou tirar a certificação logo logo…

para ficar elegivel ele tem que apontar pra nada ou seja nulo…

no caso o x2 = null seria um candidato ???

[]'s

LPJava

sim…

alberto_ribeiro

acho que entendi,

se X5 = null e x5 = x4 eu estarei dizendo que perderei a referencia que ele tinha com X3 que é a unica referencia ao objeto X3 por que na verdade o X3 real ja aponta pra outro lugar…

certo será ou viajei profundamente ?

[]'s e obrigado

Omeganosferatu

Na verdade cara se voce tem um objeto
teste c1 = new teste();

e logo depois voce tem uma referencia teste que “aponta” pra c1

teste c2 = c1;

na verdade voce ainda tem 1 unico objeto, e 2 referencias pra esse objeto

se voce fizer isso :

teste c1 = new teste();

teste c2 = c1;

c1 = null;

Voce ainda nao terá nenhum objeto qualificado pra coleta, pois o objeto ainda existe, mas agora a única coisa que mudou foi que tem apenas 1 referência e não duas como antigamente.
Mas se acrescentarmos a linha
c2 =null;

Dai teremos c1, c2 sem referenciar nenhum objeto, e até agora criamos apenas um objeto na pilha, ele será o único a ser qualificado pra remoção. Espero ter sido claro. Valeu.

Cara não sei se vou falar besteira mas tenho que tentar aprender vou tirar a certificação logo logo…

para ficar elegivel ele tem que apontar pra nada ou seja nulo…

no caso o x2 = null seria um candidato ???

[]'s

Na verdade você está se confundindo. Se voce tem 1 objeto e 5 variaveis referenciando esse objeto, ele só será qualificado pra coleta quando os 5 objetos referenciarem objetos diferentes ou forem nulos.
Essa regra vale pra quando apenas uma variavel referencia 1 objeto. Dai fatalmente se essa variavel receber null, o objeto será qualificado, mas se em algum momento no teu código alguma outra variável estiver referenciando esse objeto, ele ainda continua vivo pro terror do Garbage Collector.

alberto_ribeiro

nossa cara muito obrigado mesmo acho que agora saquei a jogada…

[]'s e muitoooo obrigado messssmo…

neohacker

alberto_ribeiro:
Cara não sei se vou falar besteira mas tenho que tentar aprender vou tirar a certificação logo logo…

para ficar elegivel ele tem que apontar pra nada ou seja nulo…

no caso o x2 = null seria um candidato ???

[]'s

Ta errado uma variavel apontada pra null eh somente uma variavel apontada pra null…

agora supomos

Integer idade = 22; //1ºobjeto criado na heap memory
Integer idade2 = 44; //2ºobjeto criado na heap memory

idade2 = idade; // Aqui temos a idade2 apontando para o objeto idade

//Apartir de agora temos 2 objetos apontando para o mesmo lugar,
sendo assim temos um objeto criado na heap mas que niguém o conhece, e esse cara sim está sujeito a conhecer o GC (só para os intimos :smiley: )

blz agora :?:

alberto_ribeiro

blz… obrigado pela resposta…

[]'s

Criado 15 de maio de 2007
Ultima resposta 17 de mai. de 2007
Respostas 17
Participantes 9