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. 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.
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
É melhor você dar uma estudadinha antes:
http://www.jspbrasil.com.br/jsp/artigos/artigo.jsp?idArtigo=0005
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
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.