Dúvidas com coletor de lixo

4 respostas
M

Tenho o código abaixo e gostaria de confirmar quantos objetos estarão aptos para o coletor de lixo.

class Test{

Float x=5.2f;

Test(){}

Test(float f){

x=f;

}
Test getObject(Test t){

t=null;

return t;

}
public static void main(Stringargs[]){

Test t=new T();

Test t1=t;

Test t2=t.getObject();

t=null;

}

}

Acredito que tenho dois objetos para serem coletados. O objeto t e o Float x. (Correto).

Goastaria de confirmar o seguinte, se eu não atribuisse um valor para Float x, ele receberia null, Então eu teria apenas um onjeto para ser coletado? Certo?

E se o Float x fosse float x? Eu também teria apenas um objeto a ser coletado, pois float x não é objeto então não fica no heap.
Certo?

4 Respostas

bcartaxo

Tem dois erros ai kra.

Com certeza esse foi erro de datilografia, vc ta chamando um construtor de uma classe q n existe, seria no caso então:

Test t = new Test();

Mas td bem, deu pra intender =PP

O danado é q nessa linha:

Vc ta chamando o método getObject() e n tá passando parâmetro nenhum. Ele precisa de um parâmetro do tipo Test. Acredito q seja mais um erro de datilografia, e como só houve um único objeto instanciado nesse código, creio eu q vc queria passar ele.

Se for isso acredito q não há objetos a serem coletados.

As variáveis t e t2 estão null, porém a variável t1 ainda aponta para o objeto criado, logo ele n está propenso a coleta. Acredito q seja isso.

M

Retificação do código.

class Test{

Float x=5.2f;

Test(){}

Test(float f){

x=f;

}
Test getObject(Test t){

t=null;

return t;

}
public static void main(Stringargs[]){

Test t=new Teste();

Test t1=t;

Test t2=t.getObject(t);

t=null;

}

}
diego2005

Posso estar errado (se tiver, alguém me corrija), mas acho que não há nenhum objeto apto para coleta.

Você tem 2 objetos instanciados:

Test t = new Teste(); Float x = 5.2f;

Depois t1 referencia o mesmo objeto que t:

Test t1=t;

Depois t2 não referencia nada (null):

Test t2=t.getObject(t);

E depois vc anula a referencia de t:

t = null;

Mas t1 ainda continua referenciando o objeto criado…

R

Marcos Paiva:
Acredito que tenho dois objetos para serem coletados. O objeto t e o Float x. (Correto).

Goastaria de confirmar o seguinte, se eu não atribuisse um valor para Float x, ele receberia null, Então eu teria apenas um onjeto para ser coletado? Certo?

E se o Float x fosse float x? Eu também teria apenas um objeto a ser coletado, pois float x não é objeto então não fica no heap.
Certo?

acho que, como o diego2005 citou, t1 ainda vai estar apontando para o objeto que você criou e, portanto, nenhum objeto estará elegível ao GC. Mas o que vc falou é verdade: quando um objeto for elegível ao GC se seus atributos forem do tipo referencia e tiverem algum objeto, esses objetos tb estarão elegíveis. Isso aconteceria no seu exemplo se vc comentasse a linha que faz Test t1 = t;

Criado 7 de julho de 2007
Ultima resposta 9 de jul. de 2007
Respostas 4
Participantes 4