Coletor de lixo

ae alguem pode me dar uma juda sobre o coletor de lixo, qdo vou usar? em todos os programas? ou apenas alguns… vi reparando que poucos programadores usam esse recurso… é cobrado no exame 310-055, alias ta no livro do kathy!!

Mas quando vc quiser fazer isso manualmente vc pode setar suas variáveis ou objeto para null. Exemplo

teste = null; //nao vou usar +
teste2 = null; //nao vou usar +

System.gc(); //Chama o garbagge collector

cara eu só uso quando por algum motivo, libero ou posso ter liberado varias instancias…

tipo, se em um for de 1 a 100 eu faço string += “s” por exemplo, passo o gc pra pegar essas variaveis q ficaram sem referencia… blz? não sei direito, eu uso assim…

Exatamente, eu não o disse o contrário, veja bem lá no meu tópico, eu disse:

“Se vc quiser fazer isso manualmente…”

Achei que fosse interessante postar isso. Afinal, como o nosso colega disse acima, se ele tivesse várias instâncias que não fosse usar mais, ele poderia fazer um loop e chamar o gc().

Att.

entao galera n preciso me preocupar com o coletor a JVM vai se engarregar, ah n ser q eu esteja afim certo?

valeu!!

No eclipse M6 tem a funcionalidade de passar o gc simplesmente clicando em uma “lixeirinha” em sua barra de status…

Recurso muito interessante… E util.

A VM leva varias fatores em consideração… tipo a quantidade de processos correntes.
Quando estava mexendo com SWT e JFACES (Tentando por o Word dentro de um painel swing) frequentemente eu estorava a qtd de memória livre para minha aplicação. Então simples, no final de meu contrutor e chamava o gc… Acabou o problema. O mesmo aconteceu quando estava fazendo uma classe para soluções de SUDOKU. Chamava o GC para coletar as possibilidades cujo a classe já tinha serteza q não ia dar certo. Sem o gc só conseguia achar as primeiras mil e poquinhas soluções com gc cheguei achar até 5000…

as vezes é util sim chamar o System.gc() ou Runtime.gc()

Runtime.gc()? executa a mesma função? System.gc()?

Eu tb não conheço a Runtime.gc()

[quote=Flasoft]No eclipse M6 tem a funcionalidade de passar o gc simplesmente clicando em uma “lixeirinha” em sua barra de status…

Recurso muito interessante… E util.

A VM leva varias fatores em consideração… tipo a quantidade de processos correntes.
Quando estava mexendo com SWT e JFACES (Tentando por o Word dentro de um painel swing) frequentemente eu estorava a qtd de memória livre para minha aplicação. Então simples, no final de meu contrutor e chamava o gc… Acabou o problema. O mesmo aconteceu quando estava fazendo uma classe para soluções de SUDOKU. Chamava o GC para coletar as possibilidades cujo a classe já tinha serteza q não ia dar certo. Sem o gc só conseguia achar as primeiras mil e poquinhas soluções com gc cheguei achar até 5000…

as vezes é util sim chamar o System.gc() ou Runtime.gc()[/quote]

Também já passei por várias situações que só resolveu quando passei a chamar o gc manualmente…

Uma delas foi com Servlets, que faziam tratamento de imagens, tipo resize, rotação, e gerava algumas, o servidor com 4 Gb de memória, depois de uns 2 dias de teste arrebentava a memória, dai que passei a chamar sempre o gc depois de tratar as imagens, ficou 100%… isto foi num projeto que estavamos a usar o jdk 1.3 a alguns meses atras, e foi um inferno, talvez a 1.5 já resolveria este problemas sem precisar chamar o gc manualmente…

Quando vc trabalhar com multithreads fazendo coisas “bizarras” é normal estorar a memória. :smiley: dai só colocando tudo = null e depois chamar o gc que resolve…

Então moral da história… depende muito, quando vc ve que a memoria não ta sendo liberada, quando deveria… força todas as variaveis = null e depois chama o gc… quase sempre resolve o problema.
:stuck_out_tongue:

Chamar System.gc() não garante que o GC vai executar naquele momento.
E setar uma variável para null também não garante que o objeto referenciado vá ser coletado automaticamente, porém ele fica eleito a ser coletado pelo GC.

[quote=danieldestro]Chamar System.gc() não garante que o GC vai executar naquele momento.
E setar uma variável para null também não garante que o objeto referenciado vá ser coletado automaticamente, porém ele fica eleito a ser coletado pelo GC.[/quote]

Exatamente… só que… quando vc tem varias Threads executando, com loops e classes pesadas, onde cada Thread ocupa uma boa fatia da memória, vc colocando no final de cada uma tudo = null e depois chamando o gc… não quer dizer que a memória que esta Thread estava ocupando vai ser liberada no momento… mas ao fazer isto, muito provavelmente estarei forcando a VM a liberar a memória de outras Threads que estavam em execução… caso contrário muito provavelmente a VM só forçaria o GC no final de executar todas as Threads, ou de tempos em tempos, e este tempo pode não ser o suficiente, dai a importância e a diferença que existe em executar o GC…

Se não fizesse diferença executar ou não o GC com certeza não estaria no System atoa… e o método GC não deve ser algo assim:

public static void gc() {
  return;
}

Ele com certeza tem algum códigozinho miraculoso que nos salva em momentos críticos :D, um dia vc vai precisar dele e dai vc vai entender melhor heee :stuck_out_tongue:

É melhor você dar uma estudadinha antes:

http://www.jspbrasil.com.br/jsp/artigos/artigo.jsp?idArtigo=0005

http://www.devx.com/tips/Tip/14847

Há só queria deixar claro que não tenho o costume de ficar chamando o System.gc() pois também li em algum lugar, que ficar fazendo isto o tempo todo causa perda de desempenho…

Dai que as vezes que utilizei isto foi quando tive problemas de memória, e vi que o código tava ok, e vi que não dava para fazer melhor, e o = null e System.gc() salvaram a situação…

Ou seja só nestes casos… :lol:

[quote=danieldestro]É melhor você dar uma estudadinha antes:

http://www.jspbrasil.com.br/jsp/artigos/artigo.jsp?idArtigo=0005

http://www.devx.com/tips/Tip/14847[/quote]

Muito bom o link do jspbrasil… já tinha lido isto a muito tempo, este já é um artigo muito velho do site, quase certeza que foi ai q li que System.gc() prejudica o desempenho… :lol:

Bem a minha mensagem anterior apesar de ter postado sem ter lido a tua, acho que já expliquei que é preciso ter bom senso e só usar quando ve que realmente não há alternativa…

E claro dentro de loops não convém :D, imagina isto dentro de um loop do tipo FOR, fica a zerar a variavel X e ai o loop fica infinido :twisted: lol

Respondendo a perguda…

E

E

E assim vai…

Ou seja colocaram no System para ser um atalho :smiley:

Suspeitei des do principio… :lol:

Fonte:
1.3
http://java.sun.com/j2se/1.3/docs/api/java/lang/System.html
1.5
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html

Runtime.getRuntime().gc();
no java 5 desculpe…

Agora como eduveks disse, o gc não é pra ficar chamando e sim em momentos que se tem problemas de pouca memória…
No meu caso, quando estava fazendo o word ir para dentro de um painel, chamava ele logo no inicio do metodo main pois, como só fazia algumas alterações e já executava novamente a vm nem passava o gc então após umas tres execuções estourava a memória então eu utilizava a “lixeirinha do eclipse msm”, qdo enjuei joguei um System.gc(); no começo e pude fazer meus testes sucegado…

os outros dois eu não sabia não. Programando e aprendendo

Não se preocupe com o GC, é de responsabilidade da VM chamar ele quando necessario for =).

inicJava,

   Mesmo forçando a vinda do GC atraves do System.gc(); vc não pode ter certeza que tudo que estava para pronto pro gc foi coletado e destruido. Por isso não a essa necessidade, a VM é inteligente suficiente para saber a hora exata de chamar o GC e destruir os objetos que estão sem referencia na memoria. 

Att.