Dúvida garbage collection

4 respostas
cu_ringa

tava fazendo o teste da Caleum e me deparei com a seguinte questão e n entedi a resposta.

1 public class GC{
2    public void geraObjetos(){
3       for(int i=1;i&lt=10;i++){
4          Object 0 = new Object();
5       }
6    }
7 }

respostas:

1-Nenhum
2-Dez
3-Nove
4-Onze
5-Impossível de determinar

a resposta correta é a 5.

Se crio 10 objetos Objects dentro de um metodo e naum tem nenhuma referência global a esses objetos, num era p morrer depois de chamar o metodo naum ? E além disso o escopo é o laço "for", q é menor ainda.

4 Respostas

T

blz?
Na verdade o objeto não morre automaticamente. O objeto é deixado disponível para o garbagge collector. Porém o garbagge collector será executado apenas quando o sistema operacional der prioridade na thread dele. Ou seja é impossível de determinar quantos objetos vão existir após a execução do código, visto que não podemos determinar quando o garbagge collector será executado.

Existe um comando (System.gc():wink: que pede para o sistema operacional rodar o collector, porém não é garantia que será executado naquele momento.

Espero ter ajudado.

eduveks

Bem pelo q sei, não é possível determinar por q o Garbage Collection não limpa na hora.

Mais ou menos assim, tu executa o método, e ele coloca numa lista tudo q tem q ser removido da memória, mas não vai remover já, vai remover quando for uma boa altura, e ai começa a remover, mas pode não remover tudo de uma vez, depende, o Garbage Collection faz tudo de maneira a não influenciar o desempenho da aplicação, por isso ele vai fazendo estas tarefas nas brexas.

Qualquer coisa me corrijam por favor, tb não tenho a certeza absoluta se é assim, mas é a idéia q tenho.

T

Complementando a resposta do eduveks realmente não é possivel determinar quando será executado por ser uma thread de baixa prioridade.

Ao executar o System.gc() o sistema operacional é que vai determinar se será executado no mesmo momento ou não.

maquiavelbona

Só fazendo um adendo. Não há um padrão para execução do GC e mesmo quando “sugeres” a ele rodar, não há garantias que ele fará naquele momento. Os objetos só são recolhidos definitivamente na segunda vez que o mesmo rode. Na primeira vez, ele marca para coleta todos os objetos que podem ser coletados, na segunda vez ele executa o método finalize() do objeto e o recolhe logo em seguida. Se por algum motivo o método finalize não permitir o recolhimento do objeto (por exemplo, refazendo a referência do objeto), o método não é executado uma segunda vez, mesmo que o GC seja executado mais N vezes.
Para mais informações, procurar no fórum, na parte de Artigos/Tutoriais por Garbage Collector.

Até!

Criado 31 de julho de 2007
Ultima resposta 31 de jul. de 2007
Respostas 4
Participantes 4