Oi Pessoal eu não sei se já existe algum tópico referente a esse assunto pesquisei mas não consegui encontrar. minha duvida é a seguinte;
se instanciarmos uma classe Test.
[code]
class Test{
public static void main (){
Test t = new Test(); // aqui o objeto t está no acervo
t = null; // agora t será recolhido pelo GC
//e no caso de ?
new Test(); // como fazer para o Coletor recolhe - la quando não for mais necessaria?
// como essa linha de comando se comporta em relação a memoria ela entra no acervo ?
}
}
[/code]
Cuidado - não confunda “objetos” com “variáveis”.
No código que você mostrou, “t” é o nome de uma variável.
É por isso que não existe “o nome de um objeto”.
Muita gente pergunta “como é que posso achar o nome de um objeto”?
A resposta é: a pergunta não faz sentido. Quem tem nome é uma variável, não o objeto.
Para identificar os objetos, vou dar um número para eles, para você não se confundir.
Isso vai lhe ajudar bastante com aqueles exercícios de certificação.
class Test{
public static void main (){
Test t = new Test(); // cria um objeto @1 . A variável t recebe uma referência para @1.
t = null; // O objeto @1 não é mais referido por t. Se não houver nenhuma outra referência, @1 pode ser recolhido pelo GC.
new Test(); // cria um objeto @2. A partir daqui, se não houver nenhuma outra referência, @2 pode ser recolhido pelo GC.
}
}
Por que é que eu disse “se não houver nenhuma outra referência”?
É que outras partes do código, que você não está vendo, podem receber referências para o tal objeto.
Vou mudar o seu exemplo um pouquinho, só para você ver.
class Test{
private static List<Test> objetosCriados = new ArrayList<Test>();
public Test() {
objetosCriados.add (this);
}
public static void main (){
Test t = new Test(); // cria um objeto @1 . A variável t recebe uma referência para @1, mas Test.objetosCriados também adquire uma referência para @1
t = null; // O objeto @1 não é mais referido por t. Se não houvesse nenhuma outra referência, @1 poderia ser recolhido pelo GC.
// Só que o problema é que Test.objetosCriados ainda tem uma referência para @1, portanto @1 não pode ser limpado pelo GC.
new Test(); // cria um objeto @2. A partir daqui, se não houvesse nenhuma outra referência, @2 poderia ser recolhido pelo GC.
// Só que o problema é que Test.objetosCriados tem uma referência para @2, portanto @1 não pode ser limpado pelo GC.
}
}
Viu? É por isso que o problema de saber se um objeto foi coletado ou não, não é muito trivial porque exige você olhar o código inteiro, não só um pedacinho.
Muito obrigado! Vc explicou muito bem! estou lendo o livro “Use a Cabeça Java” vc me recomenda algum livro para ler depois desse?