System.gc()  XML
Índice dos Fóruns » Google Android e Java Micro Edition (ME)
Autor Mensagem
JavaES
Java Ninja
[Avatar]

Membro desde: 16/03/2008 22:34:12
Mensagens: 298
Localização: Vitória-ES
Offline

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?

http://www.insidemobile.com.br/

Grandes homens fazem o impossível por que eles tentam o impossível.
psandrelli
JavaChild
[Avatar]

Membro desde: 17/05/2007 15:39:35
Mensagens: 128
Localização: Belo Horizonte-MG
Offline

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

boolean euEstiverVivo = true;
do {
System.out.println("Ozzy no Brasil...eu fui! (SP-área vip)");
} while (euEstiverVivo);

Pablo Sandrelli
nbluis
GUJ Master
[Avatar]

Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline

psandrelli wrote:É 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á.

Luis Eduardo Bohrer

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
[WWW]
psandrelli
JavaChild
[Avatar]

Membro desde: 17/05/2007 15:39:35
Mensagens: 128
Localização: Belo Horizonte-MG
Offline

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.


All right.

boolean euEstiverVivo = true;
do {
System.out.println("Ozzy no Brasil...eu fui! (SP-área vip)");
} while (euEstiverVivo);

Pablo Sandrelli
bbmany
JavaTeenager
[Avatar]

Membro desde: 04/12/2007 17:23:24
Mensagens: 188
Offline

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

- Brena Monteiro -
Pós-graduanda em Engenharia de Software
Bacharel em Sistemas de Informação.
Tecnóloga em Análise e Desenvolvimento de Sistemas.
Analista e desenvolvedora de sistemas web.

monteirobrena.wordpress.com

Twitter
[WWW]
Guitar_Men
JavaEvangelist
[Avatar]

Membro desde: 21/02/2008 10:01:31
Mensagens: 463
Offline

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...



[WWW] [MSN]
nbluis
GUJ Master
[Avatar]

Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline

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

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.

Até.

Luis Eduardo Bohrer

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
[WWW]
bbmany
JavaTeenager
[Avatar]

Membro desde: 04/12/2007 17:23:24
Mensagens: 188
Offline

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

- Brena Monteiro -
Pós-graduanda em Engenharia de Software
Bacharel em Sistemas de Informação.
Tecnóloga em Análise e Desenvolvimento de Sistemas.
Analista e desenvolvedora de sistemas web.

monteirobrena.wordpress.com

Twitter
[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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.


[WWW]
boone
JWizard
[Avatar]

Membro desde: 21/09/2003 16:01:35
Mensagens: 2140
Offline

JavaES wrote: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?


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.
Guitar_Men
JavaEvangelist
[Avatar]

Membro desde: 21/02/2008 10:01:31
Mensagens: 463
Offline

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...

This message was edited 1 time. Last update was at 29/04/2008 15:34:41




[WWW] [MSN]
boone
JWizard
[Avatar]

Membro desde: 21/09/2003 16:01:35
Mensagens: 2140
Offline

Guitar_Men wrote: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...
Guitar_Men
JavaEvangelist
[Avatar]

Membro desde: 21/02/2008 10:01:31
Mensagens: 463
Offline

Ela é toda sentimental essa JVM, revoltadinha...



[WWW] [MSN]
JavaES
Java Ninja
[Avatar]

Membro desde: 16/03/2008 22:34:12
Mensagens: 298
Localização: Vitória-ES
Offline

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

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


http://www.insidemobile.com.br/

Grandes homens fazem o impossível por que eles tentam o impossível.
npereirajr
JavaTeenager

Membro desde: 04/03/2008 15:21:35
Mensagens: 157
Localização: Rio de Janeiro
Offline

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,

Nelson Pereira Junior

Desenvolvedor Web e Móvel

Blog sobre desenvolvimento de aplicações móveis, J2ME, BlackBerry, FlashLite, Android, e mais:
Blog: DevMobile.blog.br

Mobile Phone: +55 21 7623-0151

GTalk e MSN: npereirajr@gmail.com
[WWW] [MSN]
 
Índice dos Fóruns » Google Android e Java Micro Edition (ME)
Ir para:   
Powered by JForum 2.1.8 © JForum Team