System.gc()

Para que exatamente serve o método System.gc()?
Vale a pena usá-lo ou ele sobrecarrega muito o processador?
É bom usá-lo no final de um looping que atualiza os dados no display?

Serve para invocar o Gabage Colector do Java.
Chamar o GC, não garante que ele irá ser executado, o GC roda em baixa prioridade. O coletor de lixo só passa quando a VM quer.
É babagem chamar o System.gc().

Não diria que é bobagem.
É tipo um aviso da aplicação, de que naquele momento não teria problema para a ela o GC rodar buscando pelo lixo.
Não existe a garantia de que ele vai rodar, mas se a VM estiver em um baixo processo é provável que vá.

[quote] Não diria que é bobagem.
É tipo um aviso da aplicação, de que naquele momento não teria problema para a ela o GC rodar buscando pelo lixo. [/quote]

All right.

Em quais momentos é recomendável a utilização do System.gc() ???

Se o seu programa esta bem estruturado , deixa eu ver… Nunca !! Maior migué esse GC ai AIuhAiuhaiuah zuera!!! Mas a sun adverte que não precisa chamar esse método excplicitamente não…

Isso sim é uma pergunta difícil de responder.

Sinceramente, a última(e que me lembre única) vez que e eu usei era algo assim:
Era um processo que fazia um processamento um pouco longo de leitura de arquivos, tratamento, gravação em banco e uns outros processos que agora não vem ao caso.
Ai ele rodava e depois dormia por uns 15 ou 20 segundos.

Nesse caso no final do processo eu chamava System.gc(), com o intuito de influenciar a VM a rodar o GC enquanto o programa dormia, por que depois desses 15 a 20 segundos ele voltaria com um processamento longo novamente.

Não que isso tivesse um grande impacto, mas não faria mal a ninguém.
E caso a GC rodasse nesse meio tempo certamente iria me economizar recursos. :smiley:

Até.

Obrigada! Deu pra ter uma idéia do funcionamento do System.gc() e quando ele pode ser inserido.

Presença de System.gc() em código indica que ele foi introduzido para fazer alguma gambiarra.

Uma gambiarra clássica que exige o System.gc é o uso de classloaders customizados para bibliotecas JNI de código nativo. Como vocês devem saber, existe System.loadLibrary mas não existe System.unloadLibrary (ou coisa parecida). Se você precisa de algo parecido com isso (por algum motivo você tem de liberar o código nativo com (FreeLibrary) , e você tem o controle total de seu programa, então você tem de liberar todas as instâncias da classe (carregada por um classloader customizado), e então liberar o próprio classloader. Isso requer tipicamente 2 a 3 ciclos de garbage collection.
E é por isso que não recomendo usar JNI em aplicações J2EE, porque elas podem ignorar completamente o System.gc dentro do código (elas podem fazer isso, através do uso de policies específicas do J2EE), e tal truque não pode ser usado.

[quote=JavaES]Para que exatamente serve o método System.gc()?
Vale a pena usá-lo ou ele sobrecarrega muito o processador?
É bom usá-lo no final de um looping que atualiza os dados no display?[/quote]

Vi umas respostas aqui e acho que o pessoal não reparou que está sendo falado no contexto do J2ME, afinal sua pergunta está neste fórum e não no Java Avançado, por exemplo.

Bem, o System.gc() deve ser executado quando você cria um objeto macro que tem muitos filhos e este macro foi destruído. Ao invés de esperar o GC para que a memória seja liberada (as vezes ele pode estar dormindo…rss)…você pode dar um pedá-la robinho nele e falar:

“Fio, vai lá capina o terreno que já tá sujo denovo…”

Então, nestas operações em que você cria muitas Strings e joga fora ou qualquer outro objeto, ainda mais no J2ME é recomendável sim fazer uma sugestão com o System.gc() para que a coleta de lixo seja realizada.

Não dá para comparar um GC da JVM de um desktop com a implementação em J2ME. É covardia…por isto mesmo você tem que ajudar e dar pistas ao longo do código, onde o GC poderia estar liberando memória para a sua aplicação sempre rodar com folga…

A não ser que ela seja devoradora de recursos, acho difícel esgotar a memória, mas acho boa prática sim chamar o GC e não acho que comprometa o processador do celular.

Mas se a JVM para J2ME eh implementada como nas outras, então chamar o GC não vai garantir que o mesmo seja executado… Apenas vai avisar a JVM que seria de bom grado o GC passar… Isso ja foi tópico de muitos “quebras” aqui no guj então sei la…

Sim…é sempre uma sugestão…a JVM obedece se quiser… :lol:

Ela é toda sentimental essa JVM, revoltadinha…

Huahuauah… realmente a JVM está muito engraçadinha, cheia das coisas.

Legal pessoal, valeu mesmo… deu para entender bem o seu funcionamento.

Fiz uns testes uma vez num nokia s40, e sempre que eu chamava System.gc ele limpava a memória, sem exceção.

Acredito que deva existir um cálculo que a VM faz, para saber se deve obedecer à chamada ou não. Algo envolvendo a memória disponível x memória usada. Por exemplo, não teria porque ela executar o GC se ainda tem disponível 1GB de memória e sua aplicação usou apenas 2MB, no caso de uma aplicação JSE. No entanto, seria ótimo chamar o GC se um celular tivesse apenas 512KB de memória e a aplicação usou 100KB.

Na verdade, no teste que fiz com o Nokia s40, se você não chamar o System.gc, e você começar a usar bastante recursos de memória, quando tiver quase acabando a memória disponível a própria JVM chama o System.gc automaticamente. Mas acredito que tenha algumas implementações da JVM J2ME em outros fabricantes que não faça isso automaticamente. Ou seja, se você não chamar System.gc a memória estoura.

Portanto, eu sempre gosto de usar System.gc quando termino de usar muitos recursos e sei que existem lixo na memória. É o caso quando não preciso mais de imagens, quando terminei de fazer uma requisição http que baixou um XML grande, etc. Me sinto mais confortável fazendo isso.

Nos BlackBerry você não deve ficar chamando System.gc. Ele faz isso automaticamente quando necessário, como no caso do Nokia. Mas ao contrário do Nokia, se você chama o System.gc no BlackBerry a aplicação fica travada por alguns milisegundos até o processo do System.gc ter terminado, sendo mostrado nesse meio tempo uma aplulheta na tela de sua aplicação.

Abraço,