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.
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.
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());