[RESOLVIDO] Dúvida sobre Garbage Collector

3 respostas
ECO2004

Pessoal, me tirem uma dúvida sobre GC e método finalize!

No livro do Deitel, 8ª edição - pag. 258, ele diz o seguinte sobre o GC:

“O método finalize é chamado pelo coletor de lixo para realizar limpeza de terminação sobre um objeto um pouco antes de o coletor de lixo reivindicar a memória do objeto. Um problema com relação ao método finalize é que não há garantias de o coletor de lixo executar em uma hora especificada[…] O coletor de lixo nunca pode executar antes de um programa terminar. Portanto, não fica claro se, ou quando, o método finalize será chamado.”

Não sabemos quando o coletor de lixo é chamado exatamente. Se eu tenho um programa com várias referências a outros objetos e em determinado ponto eu determino essas referências como NULL, esses objetos estão aptos a coleta de lixo, mas o programa ainda não terminou. Se o coletor de lixo executar nesse momento, todos os objetos referenciados pelo programa que perderam a sua referência terão o seu método finalize chamado e sua memória reivindicada pela JVM. Agora quando o programa terminar: na main eu criei um objeto para poder acessar os método e tudo mais. Esse objeto será o último a ser coletado. Antes, o método finalize do programa será chamado e, após, o GC reivindicará a memória do programa.

Me corrijam se eu tiver escrito algo errado até agora…

Assim, por que o Deitel disse que não se sabe se o método finalize será chamado? Outra coisa. Quando ele fala o coletor de lixo nunca pode executar antes de um programa terminar, ele quis dizer que o coletor de lixo nunca pode ser chamado para limpar o programa antes de ele terminar, pois ele ainda está em execução, né?

Valeu, pessoal!

3 Respostas

E

Não tenho o livro do Deitel em inglês, mas acho que há um errinho de tradução.

O método “finalize” é chamado por uma thread separada, chamada “finalizer”, que fica dormindo o tempo inteiro e só acorda muito de vez em quando (tipicamente a cada 1 ou 2 garbage collections completas).

Quando ela acorda, se é que ela vai acordar, varre uma lista de objetos cujo método finalize deve ser chamado.

Como ao sair do programa não há necessidade de chamar o garbage collector (porque, obviamente, o processo inteiro vai morrer e a memória será retornada ao sistema operacional), então muito provavelmente o finalizer não vai ser chamado.

marcosharbs

Ele não fala que o método finalize não será chamado
e sim que não há garantias que o método será chamado
na hora.
Mesmo você chamando o GC na mão você não sabe
em que momento exato ele vai matar os objetos, isso
que ele quis dizer.

ECO2004

Obrigado!

Criado 16 de janeiro de 2013
Ultima resposta 17 de jan. de 2013
Respostas 3
Participantes 3