Finalização de objeto

11 respostas
luciano2

Ola a todos, eu estava pesquisando como retirar objetos da memória quando me deparei com uma duvida.

System.gc chama o garbage Collector

System.runFinalization inicia a finalização dos objetos

Qual a diferença entre os dois? Os dois fazem exatamente a mesma coisa? Existe vantagem em um ou outro?

11 Respostas

peczenyj

Não fazem a mesma coisa.

System.gc() PODE invocar o garbage collector

O runFinalization, por sua vez, “Runs the finalization methods of any objects pending”, ou seja, roda o finalize dos objetos pendentes depois que o garbage collector atuou.

Aqui tem mais detalhes
http://www.codeguru.com/java/tij/tij0051.shtml

juliofsn

System.gc não chama o garbage collector, apenas informa para o garbage collector que ele pode ser executado assim que puder.

System.runFinalization chama os métodos finalize dos objetos de classes que possuem esse método implementado, independente do garbage collector atuar sobre eles, por isso é preciso ter cuidado ao usar o runFinalization, já que pode deixar objetos que não necessariamente serão descartados em um estado instável.

peczenyj

É verdade, por um momento achei que era só para alguns objetos.

luciano2

Era justamente essa minha duvida.

finalize() é chamado pelo garbage collector quando o objeto não está mais sendo utilizado, nesse caso se eu chamar o runFinalization() então os objetos serão finalizados antes do garbage collector atuar, mas isso não implica que eles seram removidos da memoria da mesma forma eles terão que ser colletados.

Então o correto para limpar a memória seria chamar o System.gc() ?

juliofsn

peczenyj, você está certo, eu que me confundi. Vendo o Javadoc eu vi que tinha me enganado.

Então fica a resposta, o runFinalization, chama o método finalize dos objetos pendentes a serem descartados e que não tiveram seus métodos finalize executados ainda.

De toda forma, deu pra ver que eles têm propósitos bem diferentes.

ViniGodoy

O correto, para limpar a memória, é retirar todas as referências dos objetos não mais utilizados. O garbage collector geralmente se vira muito bem sozinho e, a menos que você vá rodar um vídeo ou um processo muito crítico em seguida, não há necessidade de chamar System.gc().

Mesmo depois do gc rodar, nada garante que a memória que ele liberar será retirada do sistema operacional. A virtual machine tem um heap próprio e, pelo que eu saiba, não há nenhum comando sequer que mande ela liberar a memória desse heap. Você acaba tendo que confiar no mecanismo de liberação dela.

luciano2

Se após a finalização do processo eu setar null em todos os objetos a memória que eles utilizam fica livre para novas alocações? Ou o garbage collector tem que rodar para liberar o espaço?

Alguem conhece algum artigo que fale sobre alocação de memória ,uso do garbage collector e otimização do uso de memória?

peczenyj

Depende dos objetos. Alguns podem ficar inelegiveis ao garbage collector.

http://www.guj.com.br/article.show.logic?id=28


luciano2

Vlw a ajuda, li o artigo e achei bastante interessante. Espero aplicar isso em algum lugar.

peczenyj

Na duvida rode o seu programa com um profiler e observe o consumo de memoria do mesmo.

(o NetBeans tem um, se não me engano)

ViniGodoy

Se você finalizar o processo quem limpará a memória ocupada por esse processo é o próprio sistema operacional. Aí não vai sobrar nada, nem o que você liberou, nem o garbage collector, nem a VM.

Agora, sem finalizar, o garbage collector vai liberar memória de tempos em tempos. Entretanto, quando se fala nessa liberação, estamos falando da liberação da memória dentro do heap, não ocupada pelo heap em si. Essa é praticamente impossível se desalocar através de um comando (como System.gc());

Criado 4 de junho de 2010
Ultima resposta 4 de jun. de 2010
Respostas 11
Participantes 4