Metodo System.gc();  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3928
Offline

ViniGodoy wrote:
juliocbq wrote:É verdade. Não havia lido corretamente a documentação. Mas é meio estranho sugerir, não!? As vezes, nós precisamos.


Estranhíssimo. Mas a sun nunca abriu mão do direito único e exclusivo que a VM tem de controlar o gc.
Já foram feitos pedidos para criar comandos que suspendam o gc, ou que forcem sua execução, mas implementações disso sempre foram negadas.

A próxima versão de garbage collector vai trazer modificações importantes, que a princípio o tornará apto a aplicações de tempo real. Mesmo nessa versão, será impossível forçar o gc a fazer qualquer coisa. Se quiser ler mais sobre ela:
http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-5419&yr=2008&track=javase


Tenho uma aplicação de vídeo, que captura de cameras ip. Isso lendo um mjpeg e criando sequencias jpg. Dado alguns minutos, o gc passava, e a captura parava por uns 10s. Passei a utilizar o System.GC(), e ele passou a realizar a coleta antes do acumulo. Fiz com base naquele artigo que postei. Até hoje não me trouxe mais problemas.

www.citrox.com.br
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20584
Localização: Curitiba/PR
Offline

Eu tive os mesmos problemas com jogos. Ao final de uma fase, geralmente todos os objetos do cenário são destruídos e um novo cenário é montado.
Então, o usuário começa a jogar a segunda fase e, bem no meio, o jogo congelava. Também resolvi chamando System.gc() logo após a troca de cenário.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3928
Offline

O G1, que é o novo gc, pelo que li, no link que o vini postou, é capaz de prever o tempo da pausa, e otimizar a coleta. Muito interessante. Vai resolver muitos problemas de performance.

www.citrox.com.br
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3928
Offline

Cannot guarantee hard real-time behavior


Mesmo com o g1, não é garantida a performance, como java realtime system.

This message was edited 1 time. Last update was at 29/09/2009 14:07:07


www.citrox.com.br
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20584
Localização: Curitiba/PR
Offline

juliocbq wrote:Mesmo com o g1, não é garantida a performance, como java realtime system.


Sem que o programador controle exatamente o garbage collector, nunca será possível garantir hard-real time.
Pelo menos, não se o intervalo de tempo for muito curto.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

ViniGodoy wrote:
juliocbq wrote:É verdade. Não havia lido corretamente a documentação. Mas é meio estranho sugerir, não!? As vezes, nós precisamos.


Estranhíssimo. Mas a sun nunca abriu mão do direito único e exclusivo que a VM tem de controlar o gc.
Já foram feitos pedidos para criar comandos que suspendam o gc, ou que forcem sua execução, mas implementações disso sempre foram negadas.


Não é estranho, aliás é de esperar e totalmente óbvio se você pensar na razão de ter um CG para começo de conversa: ambiente gerenciado.

Ora se o ambiente é gerenciado, em particular a memória, deixar que o programador interfira com isso é totalmente contra o objetivo pois tornaria a VM um ambiente não-gerenciado. O fato de poder sugerir já é muito bom, embora se vc esquecer que isso existe nunca terá problemas.

Se tiver problemas de memoria com java o problema está na sua aplicação , nas API que usa ou na pouca memoria ram disponivel.
mandar o GC correr, não vai alterar a qualidade destas 3 coisas....

O que é estranho é o método gc existir, e não que a sua implementação seja opcional (lembrar que o java é uma especificação).

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
Bruno Laturner
GUJ Expert
[Avatar]

Membro desde: 18/02/2008 16:17:53
Mensagens: 3002
Offline

Em teoria, num ambiente gerenciado perfeito, o GC coletaria o lixo na hora certa, usando tempo de processamento mínimo, mantendo a aplicação sempre eficiente. Bem, não vivemos em sonhos.

System.gc() existe por pragmatismo.

This message was edited 1 time. Last update was at 29/09/2009 15:20:37


A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra
[WWW]
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3928
Offline

o grande problema é que o gc não é inteligente, como postado no link anteriormente. http://developers.sun.com/learning/javaoneonline/j...n=TS-5419&yr=2008&track=javase


Se a sun permitisse o controle dele, pelo desenvolvedor, estaria aumentando o poder do java.

www.citrox.com.br
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20584
Localização: Curitiba/PR
Offline

sergiotaborda wrote:Se tiver problemas de memoria com java o problema está na sua aplicação , nas API que usa ou na pouca memoria ram disponivel.
mandar o GC correr, não vai alterar a qualidade destas 3 coisas....


Ninguém falou em rodar o gc por problemas de falta de memória. O problema é o gc rodar em horas impróprias, como os casos que citamos acima.

sergiotaborda wrote:O que é estranho é o método gc existir, e não que a sua implementação seja opcional (lembrar que o java é uma especificação).


Não acho estranho que esse método exista. Aliás, também acho que deveria ser obrigatória a execução do gc(). Isso não torna o ambiente não gerenciado, de forma alguma. Ninguém está falando aqui em não ter um garbage collector, ou deletar objetos diretamente.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

juliocbq wrote:o grande problema é que o gc não é inteligente, como postado no link anteriormente. http://developers.sun.com/learning/javaoneonline/j...n=TS-5419&yr=2008&track=javase


Se a sun permitisse o controle dele, pelo desenvolvedor, estaria aumentando o poder do java.


Vc está assumindo que 1 desenvolvedor é mais oportuno que um algoritmo desenvolvido e comprovando por
dezenas (senão centenas, quiça milhares ) de desenvolvedores. Isso simplesmente não é verdade.

O poder do CG , como do hotspot, está em exactamente ninguem poder por a mão.
Veja, se existisse uma api de controle do CG ninguem poderia lançar um CG que não fosse compativel com ela.
se ela desse muito poder ao programador, nunca teriamos um CG apto para realtime.

A Sun, nem o JCP devem primitir este tipo de promiscuidade. Nunca!

This message was edited 1 time. Last update was at 29/09/2009 16:19:34


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

ViniGodoy wrote:
Não acho estranho que esse método exista. Aliás, também acho que deveria ser obrigatória a execução do gc(). Isso não torna o ambiente não gerenciado, de forma alguma. Ninguém está falando aqui em não ter um garbage collector, ou deletar objetos diretamente.


Mas indirectamente estão dizendo que querem controlar quando ( e possivelmente como) o CG roda. Isso é mesmo que o CG
não ser mais independente da aplicação.

Veja,Iterator.remove tem implementação opcional. Isto significa que vc pode mandar deletar e não vai acontecer. Inesperado talvez
mas a especificação tem que ser assim para dar conta de Arrays.asList().iterator().remove() que não pode remover os itens já que o proxy é imutável. O mesmo acontece com o CG. Porque ele é isolado e vc não o pode comandar (pode sugerir, não comandar) ele tem muita mais flexibilidade. É quase que o principio de hollywood ("don't call us, we will call you") so que "don't call us, we know what to do better than you". O CG precisa ser isolado (ou seja, náo pode existir forma de o comandar)

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
gomesrod
GUJ Ranger
[Avatar]

Membro desde: 11/05/2007 19:46:22
Mensagens: 901
Offline

juliocbq wrote:... como postado no link anteriormente. http://developers.sun.com/learning/javaoneonline/j...n=TS-5419&yr=2008&track=javase


Desculpem interromper a discussão*, mas esse link tá quebrado... alguém sabe se tem um outro que funcione?


* Muito interessante por sinal.
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3928
Offline

gomesrod wrote:
juliocbq wrote:... como postado no link anteriormente. http://developers.sun.com/learning/javaoneonline/j...n=TS-5419&yr=2008&track=javase


Desculpem interromper a discussão*, mas esse link tá quebrado... alguém sabe se tem um outro que funcione?


* Muito interessante por sinal.


Peguei o link errado. Esse aqui.

http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf

www.citrox.com.br
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3928
Offline

sergiotaborda wrote:
ViniGodoy wrote:
Não acho estranho que esse método exista. Aliás, também acho que deveria ser obrigatória a execução do gc(). Isso não torna o ambiente não gerenciado, de forma alguma. Ninguém está falando aqui em não ter um garbage collector, ou deletar objetos diretamente.


Mas indirectamente estão dizendo que querem controlar quando ( e possivelmente como) o CG roda. Isso é mesmo que o CG
não ser mais independente da aplicação.

Veja,Iterator.remove tem implementação opcional. Isto significa que vc pode mandar deletar e não vai acontecer. Inesperado talvez
mas a especificação tem que ser assim para dar conta de Arrays.asList().iterator().remove() que não pode remover os itens já que o proxy é imutável. O mesmo acontece com o CG. Porque ele é isolado e vc não o pode comandar (pode sugerir, não comandar) ele tem muita mais flexibilidade. É quase que o principio de hollywood ("don't call us, we will call you") so que "don't call us, we know what to do better than you". O CG precisa ser isolado (ou seja, náo pode existir forma de o comandar)


A opção de escolher quando o gc vai rodar já existe com esse método System.GC(). Ele resolveu um problema sério de performance que eu tinha num soft aqui. Só estamos comentando sobre a praticidade de ter controle maior sobre o coletor. Por exemplo, de poder escolher como limpar a ram.

http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf

O link acima fala das falhas do coletor de lixo, as novas funcionalidades que serão implementadas no próximo.

This message was edited 1 time. Last update was at 29/09/2009 17:25:47


www.citrox.com.br
maquiavelbona
JWizard
[Avatar]

Membro desde: 29/06/2006 09:06:51
Mensagens: 2447
Localização: São Paulo - SP
Offline

Para entender um pouco mais o CMS(Concurrent Mark-Sweep GC): http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

Até!

----------------------------------------------------------------
"Within a few years a simple and inexpensive device, readily carried about, will enable one to receive on land or sea the principal news, to hear a speech, a lecture, a song or play of a musical instrument, conveyed from any other region of the globe. "
Nikola Tesla - A means for furthering Peace (1905)

"Gedanken ohne Inhalt sind leer, Anschauungen ohne Begriffe sind blind."
Immanuel Kant - Kritik der reinen Vernunft (1781)
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team