Como esvaziar buffer

Boa tarde pessoal,

Fiz um projeto em minha máquina que possui 2GB de RAM e nunca vi problema nenhum ao rodá-lo.

Ele usa Banco de Dados MySQL via Hibernate e é instalado via Advanced Installer.

Mas ao testar em outra máquina, tomei um susto!

O programa começou a travar conforme eu ia acessando o BD!

E não é problema no código! Pq se eu fechar e abrir de novo todo o programa, ele abre qualquer frame normal, mas se começo a acessar todos um depois do otro… chega uma hora que ele trava!..

Por curiosidade dei um CTRL+ALT+DEL para ver como estava o processo…

Ai que tá…

O programa só ia aumentando o uso da memória mais e mais!!.. foi até 100.000k que é onde eu percebi que dpois disso ele n abre mais nada!

Conclusão: A certeza que tenho é que ele ta guardando tudo o que eu faço em cache… e ai é claro, chega uma hora q ele estora a pilha né…

Mas a pergunta: Como eu corrijo isso?

Como eu esvazio a pilha de cache?

Gente, alguém me dê uma luz, por favor!

To fkano locoo…
Tenho que entregar o projeto nesse fim de semana…

Abraçõss a todos!
att.

Cara, esse teu problema é muito complexo, você vai ter que debugar muito bem a tua aplicação pra descubrir exatamente o que está acontecendo, e provavelmente você vai ter que fazer várias alterações pra corrigir.

Lembre que a JVM só limpa a memória quando o objeto não tiver mais nenhuma referencia, então você vai ter que procurar por objetos que ainda são referenciados, e por quem eles são referenciados.
Veja se não tem nada estático no teu programa que guarda as telas, porque geralmente as telas listam as consultas do banco (eu acho) e essa lista de objetos deve ficar guardada em algum lugar e não eh limpa.

uma coisa que que poderia ajudar, é quando você tiver saindo de uma tela, limpar a JTable e a List onde você armazenas os objetos listados, caso você faça isso.

espero ter ajudado.

Olhe me desculpe, mas geralmente se o programa não tá rodando direito, ou consumindo muita memória, isso é código sim.

  • Veja se você está fechando as conexões, e os Statements e ResultSets da maneira apropriada (dentro de um bloco finally).
  • Não sei se é o caso, mas, evite trazer todos os registros do banco e carregálo em memórira, terminou de usar a lista, então limpe-a (list.clear() ) e depois dete a sua referência para null (lista = null).
  • Use StringBu*er (Builder ou Buffer, vai depender do caso!) para concatenação de strings (e nada de fazer texto.append("oi meu nome é " + nomePessoa) use texto.append("oi meu nome é ").append(nomePessoa) )

Essas são apenas algumas dicas para fazer um código menos comedor de recurso, acho que isso é um bom passo!
Abraços

Carregue o programa dentro de um profiler de memória(vem junto com as melhores IDEs), vai dar pra saber onde estão os vazamentos.

Então, eu uso o NetBeans e dei uma olhada no Profile tbm.

Lá eu vi aquilo msm, quando faço consultas no BD eh osso pq ele come mtaa memoria.

Agora as alterações acima não surtiu efeito no programa.

Eu vou abrindo mais e mais recursos do programa e ele não diminui 1k do uso de memória…

Eu estou usando MDI. o que eu poderia colocar para liberar memória quando fecho um internalFrame? Lembrando que estou usando o padrão Singleton.

Valew… qlqr ajuda eh bem vinda

esta ai um dos motivos de singleton ser um anti-pattern.

Como eu já tinha dito: [quote=maschiojv]Veja se não tem nada estático no teu programa que guarda as telas[/quote], evite usar simgleton.

para fazer a limpesa, use as dicas do thiago.correa, list.clear() é um bom começo.

Não vejo problema em concatenar Strings.
O compilador da Sun automaticamente converte toda a concatenação para uma única String.

Faça o teste. Concatene várias strings… compile o código e depois use um descompilador.
Acho q o StringBuffer/Builder deixa o código muito poluído. Aquele monte de append é algo que não me soa bem.

[quote=marcelo_mococa]
Não vejo problema em concatenar Strings.
O compilador da Sun automaticamente converte toda a concatenação para uma única String.

Faça o teste. Concatene várias strings… compile o código e depois use um descompilador.
Acho q o StringBuffer/Builder deixa o código muito poluído. Aquele monte de append é algo que não me soa bem.[/quote]

StringBuilder não serve para diminuir o consumo de memória, ele serve para aumentar o desenpenho, faça um teste contatenando umas 30 Strings usando + e depois com StringBuilder que você vai ver a diferença de tempo.

[quote=marcelo_mococa][quote=thiago.correa]

  • Use StringBu*er (Builder ou Buffer, vai depender do caso!) para concatenação de strings (e nada de fazer texto.append("oi meu nome é " + nomePessoa) use texto.append("oi meu nome é ").append(nomePessoa) )
    [/quote]

Não vejo problema em concatenar Strings.
O compilador da Sun automaticamente converte toda a concatenação para uma única String.

Faça o teste. Concatene várias strings… compile o código e depois use um descompilador.
Acho q o StringBuffer/Builder deixa o código muito poluído. Aquele monte de append é algo que não me soa bem.[/quote]

Pois é eu vejo, o processamento cai muito! Tanto é que é unanimidade utilizar StringB* ao invés de concatenar strings na “old fashion way”.

Faça um teste, concatene um texto simples umas 10.000 vezes usando string e depois usando stringbuilder ou até mesmo o buffer que possui os seus métodos sincronizados e me diz qual foi o mais rápido! :wink:

Então pessoal, quanto ao comentário de vocês, não sabia que o singleton poderia ser a causa da lentidao… o que vocês me recomendam? Eliminar o singleton? Será que vai surtir efeito?

Agora quanto a esses lances de concatenação de strings eu quase nem uso isso…

vlw

Evite objetos estáticos!