[RESOLVIDO] Dúvida sobre Garbage Collector

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!

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.

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.

Obrigado!