Garbage collector automatico

7 respostas
R

Feras

alguém sabe como eu posso configurar o garbage collector para rodar por exemplo a cada 15 minutos sem precisar rodar ele manual ?

7 Respostas

E
  1. Você não deveria estar rodando o garbage collector “manualmente”. Se você está precisando fazer isso, há algum problema na sua aplicação.
  2. Você provavelmente vai ter de mexer em algum parâmetro da garbage collection - isso são opções da JVM, e você precisa ler alguns artigos para ver qual método de garbage collection é mais adequado para sua aplicação. Mas que eu saiba não há nenhum parâmetro para garbage collection em períodos fixos de tempo.
  3. Se mesmo assim você estiver precisando fazer alguma coisa periódica, talvez você possa agendar a execução de alguma classe (por exemplo, se usar o Quartz ou então um “timer EJB” em ambiente EJB, ou sei lá o quê) para rodar periodicamente o System.gc. Aviso que pode ser que seu ambiente simplesmente ignore tais chamadas explícitas a System.gc.
F

Como o entanglement disse, chamadas ao System.gc() não fazem com que o GC rode. Tais chamadas apenas sugerem à JVM que, na opinião do programador, aquele é um bom momento para rodar o GC. Porém tais chamadas podem simplesmente serem ignoradas pela JVM.

O funcionamento do GC varia de JVM para JVM. O bom funcionamento do seu sistema não pode depender do algoritmos usado pelo GC.

Qual é a obrigação do GC?
Uma das premissas do GC é que ele vai remover os objetos elegíveis a remoção. São eles os objetos que não são referenciados por nenhuma variável de referência. O GC também remove os objetos que formarem ilhas de isolamento. Então, se quiser liberar a sua memória de maneira portável a sua única opção é fazer as variáveis de referência apontarem para null qnd vc não mais precisar dos objetos.

Bem, isto tudo é para resolver algum problema que vc provavelmente está tendo com relação ao consumo de memória no seu sistema. É melhor vc repensar a modelagem que está usando. Valem aquelas máximas: evitar encher a memória com qq coisa, pensar bem antes de usar um array de array de array,… esse tipo de coisa.

R

então pessoal a aplicação esta com um problema mesmo e preciso ajustar isso mais preciso de algo rapido até eu fazer esses ajutes de arquivos abertos

então existe uma forma de eu fazer com que isso execute atraves de um comando ou um cara vai lá e aperte um botão ou algo do tipo ?

E

PQP, você está usando o GC para fechar arquivos? Isso não se faz. O correto é você realmente fechar todos os arquivos no finally; não há santo que dê jeito nesse erro grosseiro de programação que (espero) os outros rapazes fizeram - nem rodar o GC a cada minuto, como há alguns loucos que fazem.

De qualquer jeito, você pode ver se na sua aplicação é possível rodar um timer ou instalar o Quartz ( http://www.quartz-scheduler.org/ ) para invocar um método que periodicamente rode System.gc.

F

robsonsan,
O GC não fecha arquivos e você não tem garantias do momento em que ele irá rodar.
Esqueça o GC. Ele não será solução para o seu problema.

Com relação aos arquivos abertos, feche-os.
Abra - Use - Feche.
Qq coisa muito diferente disto vai trazer complexidade desnecessária ao seu código e não solucionará o seu problema.

E

fvslistas:
robsonsan,
O GC não fecha arquivos…

Mais ou menos. Na verdade, alguns professores (que deveriam ser pregados em uma cruz por ensinarem coisas perigosas a seus alunos*) ensinam que o Garbage Collector irá eventualmente fechar os arquivos, já que as classes que lidam com arquivos contém aquele método finalize(), e portanto serão em algum tempo eventualmente fechados.

Só que essa limpeza é feita muito de vez em quando, a cada duas passadas do Garbage Collector em modo completo, o que pode levar um tempo muito grande. Pode levar várias horas ou até dias, por exemplo, se o sistema não estiver muito ativo.

Portanto, não é bom deixar isso a cargo do Garbage Collector. Ele deve limpar memória, não arquivos ou conexões inativas com o banco de dados.

EDIT - O castigo certo não é esse. É um outro - veja em Marcos 9:42:

F

Podes crer entanglement.
Continuo dizendo, o GC não é a solução.

Criado 30 de junho de 2010
Ultima resposta 30 de jun. de 2010
Respostas 7
Participantes 3