Estou com uma questão do livro da Kathy Sierra mas não me parece estar com a resposta certa, gostaria de saber se sou eu que estou enganado ou foi erro de digitação
Detalhe que você mudou o enunciado quando o transcreveu para o GUJ (ou talvez seja um problema da tradução, sei lá).
No enunciado original, ele pergunta quantos objetos são eleitos para coleta na linha 22 do seu código.
Essa linha está inclusive demarcada com um comentário.
Esse “detalhe” faz toda diferença, pois na linha 22 o objeto local a2, que não foi setado para null, ainda está no escopo.
Do jeito que o você colocou a resposta seriam 3 objetos. Pois a2 sairia de escopo, e restaria apenas b1 por estar referenciado numa variavel estática.
dudzjava
O livro esta correto, apenas a variável b2 que referencia o objeto BETA passou a apontar pra null , portanto no heap o objeto beta não possue mais nenhuma referência a ele sendo assim eleito para a coleta. Já o objeto ALPHA que estava referenciado pela variavel a1 que passou a apontar pra null, ainda é possível ser acessado através da variável de instancia de alpha do tipo beta a2.b2, e o objeto BETA que era referenciado por b1 ainda pode ser acessado através da variavel estática Alpha.b1,
ViniGodoy
Se no livro não tiver o comentário, está errado.
Pois aí vc pode assumir que as variáveis sairam de escopo. Lembre-se que variáveis fora de escopo também são coletadas.
Nesse caso, escrever null no final também seria indiferente, a menos que a variável estática fosse deixada null também.
ribclauport
Do jeito que o você colocou a resposta seriam 3 objetos. Pois a2 sairia de escopo, e restaria apenas b1 por estar referenciado numa variavel estática.
Vini não entendi o que você falou sobre restar a variável b1, por ela referenciar uma variável estática, após acabar o método main, não seria finalizado por meio da jvm, e o classloader?
Fiquei confuso poderia me explicar?
ViniGodoy
Se considerar o fim da vm, aí não sobra ninguém mesmo. Mas questões assim ou consideram um ponto específico (marcado por um comentário) ou o fim do método, antes da vm finalizar.
T
tioola
ViniGodoy:
Detalhe que você mudou o enunciado quando o transcreveu para o GUJ (ou talvez seja um problema da tradução, sei lá).
No enunciado original, ele pergunta quantos objetos são eleitos para coleta na linha 22 do seu código.
Essa linha está inclusive demarcada com um comentário.
Esse “detalhe” faz toda diferença, pois na linha 22 o objeto local a2, que não foi setado para null, ainda está no escopo.
Do jeito que o você colocou a resposta seriam 3 objetos. Pois a2 sairia de escopo, e restaria apenas b1 por estar referenciado numa variavel estática.
Primeiramente desculpem a demora para responder , e muito obrigado pela resposta de todos
Realmente foi um erro meu ao passar para o GUJ o enunciado ,agora , gostaria de entender se toda a variavel estatica nao importa se o objeto foi setado como null e nao exista outra referencia do mesmo, mesmo assim o objeto da variavel estatica ainda nao sera elegivel para a coleta?
Não. A variável estática existe enquanto a classe existir. Portanto, até a VM finalizar.
A menos que você defina seu valor para nulo explicitamente, o objeto apontado por ela nunca será coletado.
Aliás, uma das grandes fontes de memory leaks são variáveis estáticas. Mais um grande motivo para evitar ao máximo usa-las.
T
tioola
ViniGodoy:
Não. A variável estática existe enquanto a classe existir. Portanto, até a VM finalizar.
A menos que você defina seu valor para nulo explicitamente, o objeto apontado por ela nunca será coletado.
Aliás, uma das grandes fontes de memory leaks são variáveis estáticas. Mais um grande motivo para evitar ao máximo usa-las.
Foi exatamente esse conceito que me confundio, e por isso errei a questão .
Muito obrigado pela resposta de todos