Coletor de lixo

galera duvida simples

class Lixo{
      int y=5;
      Short r=5;
    public static void main(String...a){
    Lixo L=new Lixo(); //1)
    Lixo L2=new Lixo();// 2)
     L=L2;  //3)
    3) aqui tenho 3 objetos qualificados para coleta de lixo?
    objeto criado la linha 1 mais as suas 2 variaveis de istancia??
     ou só 2 Objectos? L e a Short r??? 
   }
}

:wink:

Não… calma…

L e L2 são referências a objetos e não objetos em sí.
Para um objeto ser elegível para a coleta de lixo, ele não pode ter nenhuma referência apontando para ele.

Lixo L = new Lixo(); vc cria um novo objeto do tipo Lixo e faz com que L aponte para ele.
Lixo L2 = new Lixo(); vc cria um novo objeto do tipo Lixo e faz com que L2 aponte para ele.

Até aqui, dois objetos do tipo Lixo criados certo?

Quando vc faz L = L2, L começa a apontar para o mesmo objeto que L2, sendo assim o objeto que era apontado por L passa a ser elegeível para a coleta, pois ele perde a referência.

Note que isso vale antes do main terminar é claro.

Outra coisa que vc deve notar é que cada Lixo tem um Short, que seria então mais um objeto para cada Lixo.

Até mais!

Nem tão simples assim…

Não. Tem apenas um objeto qualificado para coleta, o que era referenciado pela variável L do tipo Lixo, que passou a referenciar o mesmo objeto que L2. O objeto referenciado pela variável de instância r do tipo Short não está qualificado pq ele se encontra (um único objeto) em um pool onde todas as variáveis do tipo Short (inclusive as variáveis de instância r) de mesmo valor* o referenciarão, portanto L2 por fazer referência a um objeto do tipo Lixo com a variável r de mesmo valor do objeto anterior (5) não permite que o objeto Short esteja qualificado para coleta.

*Isso só é válido para valores entre -128 e 127 nos objetos de classes wrapper do tipo Byte, Short e Integer, além de Boolean e Character de \u0000 até \u007f (7f vale 127 em decimal).

Obs.: A coleta de lixo só se refere a objetos, portanto a variável de instância primitiva y não entra nessa discussão.

Nem tão simples assim…

Não. Tem apenas um objeto qualificado para coleta, o que era referenciado pela variável L do tipo Lixo, que passou a referenciar o mesmo objeto que L2. O objeto referenciado pela variável de instância r do tipo Short não está qualificado pq ele se encontra (um único objeto) em um pool onde todas as variáveis do tipo Short (inclusive as variáveis de instância r) de mesmo valor* o referenciarão, portanto L2 por fazer referência a um objeto do tipo Lixo com a variável r de mesmo valor do objeto anterior (5) não permite que o objeto Short esteja qualificado para coleta.

*Isso só é válido para valores entre -128 e 127 nos objetos de classes wrapper do tipo Byte, Short e Integer, além de Boolean e Character de \u0000 até \u007f (7f vale 127 em decimal).

Obs.: A coleta de lixo só se refere a objetos, portanto a variável de instância primitiva y não entra nessa discussão.[/quote]

Ok javadev, entao tenho que desconsiderar as variaveis wrapers em situacoes desse tipo beleza!O problema agora que tem essa questao do livro kathy que parece me deu um nó na cabeça!! veja esse codigo

class CardBoard{
   Short story=5;
       CardBoard go(CardBoard cb){
         cb=null;
        return cb;
       }
   public static void main(String...a){
   CardBoard c1=new CardBoard();
   CardBoard c2=new CardBoard();
    CardBoard c3=c1.go(c2);
   c1=null;

}
}

resposta certa do livro:
Apenas um objeto esta qualificado para coleta do lixo (c1),mas ele tem um objeto Short que tambem esta qualificado pagina 158 2 edicao
Sei que esse livro tem ums falhas,por isso que questiono .Pode ser um erro do livro? :?:
e Obrigado pela resposta!!

[quote=davidbuzatto]Não… calma…

L e L2 são referências a objetos e não objetos em sí.
Para um objeto ser elegível para a coleta de lixo, ele não pode ter nenhuma referência apontando para ele.

Lixo L = new Lixo(); vc cria um novo objeto do tipo Lixo e faz com que L aponte para ele.
Lixo L2 = new Lixo(); vc cria um novo objeto do tipo Lixo e faz com que L2 aponte para ele.

Até aqui, dois objetos do tipo Lixo criados certo?

Quando vc faz L = L2, L começa a apontar para o mesmo objeto que L2, sendo assim o objeto que era apontado por L passa a ser elegeível para a coleta, pois ele perde a referência.

Note que isso vale antes do main terminar é claro.

Outra coisa que vc deve notar é que cada Lixo tem um Short, que seria então mais um objeto para cada Lixo.

Até mais![/quote]
ok cara beleza ,se entendi Wraper tambem tenho que considerar mas a outras variaveis de instancia ?ou esse raciocinio so vale para wrapers?
ou qualquer tipo por referencia?
Obrigado!

[quote=fabioEM]resposta certa do livro:
Apenas um objeto esta qualificado para coleta do lixo (c1),mas ele tem um objeto Short que tambem esta qualificado pagina 158 2 edicao
Sei que esse livro tem ums falhas,por isso que questiono .Pode ser um erro do livro?
e Obrigado pela resposta!![/quote]
É muito provável que seja erro do livro. Essa questão a que vc se refere já foi discutida aqui no fórum questionando-se exatamente essa situação. Se eu encontrá-la te passo o link.

ok muito obrigado javadev realmente tavo numa duvida cruel!!!Tem algum livro ou site mesmo, que tu posso me indicar com relação esse assunto "otimizacao do compilador java ,pool "?Por exemplo Onde fica o pool e coisa do tipo?acho muito bacana mas nao incontro nada na net a nao ser em ingles :wink:

http://www.guj.com.br/posts/list/77248.java

Infelizmente não.