Garbage collector LIVRO SCJP

10 respostas
T

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

A pergunta é a seguinte:

class Beta{}

class Alpha{
    static Beta b1;
    Beta b2;
}
 


public class Tester 
{
    public static void main(String[] args)
    {
        Beta b1 = new Beta();        Beta b2 = new Beta();
        Alpha a1 = new Alpha();      Alpha a2 = new Alpha();
        
        a1.b1 = b1;
        a1.b2 = b1;
        a2.b2 = b2;
        
        a1 = null;    b1 = null;    b2 = null;
        
    }
}

A pergunta é quantos objetos são eleitos para a coleta.

Sendo as respostas.

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

Na minha concepção a resposta correta sera a C. com 2 objetos sendo eleitos o a1 e o b1
Mas no livro indica a B.

Qual estaria certa?

10 Respostas

ViniGodoy
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.

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

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?

G

só o a1 estaria elegível na linha 22.

vejamos:

Beta b1 = new Beta();       //Ba: 1 ref local
        Beta b2 = new Beta();       //Bb: 1 ref local
        
        Alpha a1 = new Alpha();     //Aa: 1 ref local
        Alpha a2 = new Alpha();     //Ab: 1 ref local
          
        a1.b1 = b1;     //Ba: 1 ref local, 1 ref static
        a1.b2 = b1;     //Ba: 1 ref local, 1 ref static, 1 ref Aa.b2
        a2.b2 = b2;     //Bb: 1 ref local, 1 ref Ab.b2
          
        a1 = null;   //Aa: 0 ref local, logo, remove 1 ref Aa.b2 para Ba, etão,
                     //Ba: 1 ref local, 1 ref static

        b1 = null;   //Ba: 0 ref local, 1 ref static 
        b2 = null;   //Bb: 0 ref local, 1 ref Ab.b2
          
        //Ba: 0 ref local, 1 ref static 
        //Bb: 0 ref local, 1 ref Ab.b2
        //Aa: 0 ref local
        //Ab: 1 ref local

somente o objeto Aa se tornou elegível.

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.

T

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

Criado 6 de abril de 2012
Ultima resposta 7 de abr. de 2012
Respostas 10
Participantes 5