segunda-feira, 17 de junho de 2013

Ressuscitando objetos em java

Como todos sabemos os objetos em java herdam a classe Object. Na classe Object existe um método chamado "finalize", ou seja, todos os objetos em java possuem esse método por tabela.

protected void finalize(){

}

Esse método é chamado toda vez que o Garbage Collector é acionado para limpar o objeto em questão. Para que um objeto esteja apto a ser eliminado pelo garbage collector o mesmo deve possar por uma das 3 hipóteses abaixo:

1) Object objeto = new Object()
objeto = null // O objeto passou a referenciar nulo, ou seja, a instância antiga já não é mais alcançável, tornando-a apta para a coleta

 2) Object objeto = new Object();
objeto = new Object();  // O objeto passou a apontar para uma nova referência em memória, ou seja, a referência anterior já não é mais alcançável em memória, portanto a mesma está pronta para a coleta de lixo

3) Ilhas de isolamento: Essas ilhas ocorrem quando uma classe possui uma variável de referência para outra classe. Quando um objeto da primeira classe for criado, automaticamente uma referência para a segunda classe será criada, porém se a referência para o primeiro objeto for perdida, ainda existirá uma referência do primeiro para o segundo objeto. O garbage collector consegue distinguir uma ilha de isolamento e nessas condições mesmo que uma aponte para a outra, o início da fila (referência para o primeiro elemento) foi perdida e nada mais podemos fazer com esses objetos, portanto o GC limpará os dois objetos.


Existe uma regra muito interessante com relação ao GC e o método "finalize" que pouca gente conhece. Quando o GC é ativado o método "finalize" é chamado automaticamente no intuito de remover o objeto em questão, porém é possível ressuscitarmos o objeto, impedindo que o mesmo se perca pelo GC conforme exemplo abaixo:


protected void finalize(){

//Método estático que guarda a variável de instância corrente em uma variável estática do sistema
   ClasseRessuscitadora.ressuscitar(this);

}

No caso acima a referência do objeto em questão será salva por uma variável estática através do método "ressuscitar" e não será perdida, portanto é possível dizermos que o objeto será ressuscitado. Mas se fizermos a implementação acima o sistema não entrará em looping e o objeto nunca será eliminado ?? NÃO. É neste ponto que entra uma das regras mais interessantes do GC. Já pensando nessa possibilidade esse método só pode ser interceptado uma ÚNICA vez, ou seja, a próxima vez que o GC tentar limpar esse objeto o mesmo não passará pelo "finalize" e limpará o objeto incondicionalmente.

Espero que tenham gostado!
Abraços pessoal !

Um comentário:

  1. Eis que a carta sai do cemitério direto para o deck !
    Deu até saudade do magic

    ResponderExcluir