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!