Dúvida na questão sobre coleta de lixo livro Kathy Sierra

Olá pessoal, estou em dúvida em um determinado conceito na seguinte questão:

Dado:

class CardBoard{
   
   Short story = 5;

   CardBoard go(CardBoard cb){
        
          cb = null;
          return cb;
    }

    public static void main(String[] args){
   
         CardBoard c1 = new CardBoard();
         CardBoard c2 = new CardBoard();
         CardBoard c3 = c1.go(c2);
         c1 = null;
         // faz algo
    }

}

Quando a execução chegar a // faz algo, quantos objetos estarão qualificados para a coleta de lixo?

A. 0

B. 1

C. 2

D. A compilação falha

E. Não é possível saber

F. É lançada uma exceção no tempo de execução

A resposta do livro é C, mas para mim era B pelo seguinte motivo. c1 e c2 criaram dois objetos CardBoard e também dois objetos Short. De acordo com o livro, para objetos Byte, Boolean, Short e Integer (esses para valores abaixo de 127), é true quando comparados com == se esses objetos armazenarem o mesmo valor(claro que esses dois objetos têm que ser do mesmo tipo). Bom, a explicação da resposta ser C é porque c1 deixa de referenciar seu CardBoard e tanto esse quanto o objeto o qual a variável de instância story referencia podem ser coletados pela JVM. Mas a variável c2 também cria um objeto cujo valor é 5. Portanto, de acordo com o que diz o livro, a variável de instância c2 não deveria referenciar o mesmo objeto que a variável de instância story de c1, e portanto esse objeto Short não seria coletado pela JVM?

edit: Comi algumas palavras e havia esquecido de revisar…

são 2 objetos porq temos o objeto c1 e o objeto story que é uma variável de instancia e como tb é um objeto ele tb será eleito para a coleta…

c1 e c2 são 2 objetos distintos e c3 ja recebe uma referência nula…
acho que o exercicio parte do suposto que depois do comentário “faz algo” vc ainda teria que utilizar os objetos c1 e c2

e ae vmsb11? Então, eu até entendi isso. Mas eu fiquei na dúvida porque c2 também tem um variável do tipo Short cujo valor é 5, ou seja, o mesmo valor que a variável story de c1 armazena. E de acordo com o livro, para economizar memória, ambos deveriam referenciar o mesmo objeto. E como c2 não perdeu a referência para o seu objeto, imaginei que o Short que armazena o 5 não deveria ser coletado.

Bom, vamos ver, pode ser que eu esteja interpretando de maneira errada o que diz o livro… vou copiar o trecho:

"Para economizar memória, duas instâncias dos seguintes objetos wrapper serão sempre == quando os seus valores primitivos forem o mesmo:
. Boolean
. Byte
. Character de \u0000 até \u007f(7f é 127 em decimal).
. Short e Integer de -128 até 127 "

Será então que sempre os objetos terão instâncias diferentes mas o operador == devolve true quando objetos de valores iguais são comparados? Mas onde estaria a economia de memória neste caso?

opa vc está corretissimo douglas acabei de olhar a errata do livro na verdade é story = 200 em vez de story = 5;
olha o link da errata http://www.coderanch.com/t/257589/Programmer-Certification-SCJP/certification/K-B-SCJP-Errata-Updated
la está escrito assim :

“259…clarify…Q-2: code s/b: Short story = 200;
& 266

e com isso a resposta é msm c porq acima do valor de 127 o java criará 2 objetos distintos no caso do exercicio…

bom, se fosse story = 5 aí a resposta seria 0 objetos, espero que tenha entendido, é sempre bom olhar na errata do livro :slight_smile:

AH! Legal!! Valeu, muito obrigado pela ajuda vmsb!! Agora ta esclarecido! Grande abraço!

Que confusão. O Short não tem nada a ver com a historia.

Ele é referenciado pelo objeto onde está, portanto nunca é elegivel na linha em causa. (ele será elegivel depois que os objetos que o referenciam seja recolhidos ou anulados).

Objetos elegíveis são aqueles que existem no fim do método e não são atributos de outros objetos. (porque o CC não corre durante o método , apenas antes ou depois).

A pergunta é o mesmo que perguntar : Quantos objetos foram criados que não são referenciados por ninguem quando o método termina. (Short, obviamente não está nesta categoria)

Fala Sergio, tudo bem? Então, há uma relação com o Short sim. A resposta correta é 2 justamente porque o objeto Short entra em uma “ilha de isolamento”. Ele continua sendo referenciado por uma variável dentro do objeto CardBoard, mas esse já não é mais referenciado por uma variável de referência na pilha. Agora, se o livro não estivesse errado, e o código fosse o mostrado acima (com Short recebendo 5), o objeto Short seria referenciado por duas variáveis de instância (duas variáveis story). Uma delas seria perdida (porque c1 recebeu o valor null), mas uma delas se manteria (a que corresponde ao objeto CardBoard referenciado por c2), e a resposta seria 1.