Consumo de memória

Pessoal, fiz um programa em java e quando ele inicia o consumo de memória está em 20mb, bom dai pra frente cada tela que eu abro ele aumenta esse consumo, só que quando eu fecho a tela ele não diminui e depois de algum tempo ele passa de 100mb.

Alguém tem alguma idéia do que pode ser e como posso baixar esse consumo?

Abraço

Como vc está fechando as janelas?

Lembre-se que o Garbage Collector roda quando a JVM decide e o simples fato de fechar uma janela (de forma correta) apenas torna objetos elegíveis a coleta.

Se tiver usando swing é isto mesmo. Tenho uma aplicação aqui que varia de 200mb a 250mb.
Dava medo dela, por isto passei tudo para web e agora ele consome míseros 45mb.

[quote=Diego Silveira]Como vc está fechando as janelas?

Lembre-se que o Garbage Collector roda quando a JVM decide e o simples fato de fechar uma janela (de forma correta) apenas torna objetos elegíveis a coleta.[/quote]

Bom, eu tenho uma tela a partir da qual eu abro as outras, a instancia das outras classes é feita por uma variavel statica para que quando eu feche a janela eu possa passar o paramentro null pra variavel.

assim:

[code]public class TelaInicial{…

public static OutraTela tela = null;
…[/code]

depois que eu fecho a tela, eu passo o paramentro pra tela inicial assim:

TelaInicial.tela = null;

O que achas?

É verdade, usando swing, o consumo de memória crescente é normal.
Na maioria dos casos, nem efetuando chamadas explícitas ao garbage collector o problema é resolvido.

mas não tem nenhuma maneira de ir diminuindo esse consumo?

Muitas coisas podem influenciar na memoria do java um pode ser o banco veja se esta fechano o pool de conexao … sempre que a uma …

[quote=c#]Muitas coisas podem influenciar na memoria do java um pode ser o banco veja se esta fechano o pool de conexao … sempre que a uma …
[/quote]

bem, sempre que faço uma chamada a uma conexao com o banco coloco no metodo finalize() encerrando o Connection, PreparedStatment e ResultSet, dependendo do que tenha sido utilizado.

O que mais poderia influenciar?

Uma sugestão seria eliminar o máximo de referências possível.

Em último caso, faça alguma chamada explícita ao garbage collector, mas tome cuidado porquê isso não é muito recomendado.

[quote=davidtiagoconceicao]Uma sugestão seria eliminar o máximo de referências possível.

Em último caso, faça alguma chamada explícita ao garbage collector, mas tome cuidado porquê isso não é muito recomendado.[/quote]

Como assim eliminar referências?

[quote=Jorgev][quote=davidtiagoconceicao]Uma sugestão seria eliminar o máximo de referências possível.

Em último caso, faça alguma chamada explícita ao garbage collector, mas tome cuidado porquê isso não é muito recomendado.[/quote]

Como assim eliminar referências?

[/quote]

Construa seus componentes de modo que os componentes que não são necessários no determinado momento fiquem fora de escopo ou algo neste sentido. Como foi comentado, finalize as sessões desnecessárias, tente não criar variáveis estáticas, tente não deixar objetos “invisíveis” instanciados, entre outras técnicas.

Veifique se so o Java ta consumindo memoria… ou se o banco esta tambem consumindo muito… verifique o tempo de resposta das consultas no banco…
… cara ja trabalhei em um grande projeto swing. na TOTVS … e vou te deixar bem assustado… projeto java SWING é uma bosta… a um grande problema de performance… voce esta jogando a conexao pro Pool de objetos ou voce esta abrindo e fechando a conexao toda hora? a cada evento?

Bom, eu vou tentar fazer algumas alterações, qualquer coisa posto os resultados aqui.

Se alguém tiver mais alguma dica, manda ai.

Abraço

[quote=c#]Veifique se so o Java ta consumindo memoria… ou se o banco esta tambem consumindo muito… verifique o tempo de resposta das consultas no banco…
… cara ja trabalhei em um grande projeto swing. na TOTVS … e vou te deixar bem assustado… projeto java SWING é uma bosta… a um grande problema de performance… voce esta jogando a conexao pro Pool de objetos ou voce esta abrindo e fechando a conexao toda hora? a cada evento?[/quote]

Eu tou abrindo e fechando toda hora.

Pool é um conjunto de alguma coisa. Uma fonte de objetos. Por exemplo: Um Pool de conexão ao banco de dados. Vc teria Um objeto controlando umas 30 conexões com o banco. Assim quando vc precisar de uma conexão, vc pega deste objeto. Isso torna a aplicação mais rápida, visto que vc não precisa esperar a conexão ao banco e ainda possui várias conecxões para melhorar a performance

Mas se eu tiver com várias conexões nesse Pool não vai ficar mais pesado não? e como é que cria esse Pool?

no google vc acha bastante referencia sobre isso…
è pra fica mais rapido pois ele nao fica abrindo e fechando conexao toda hora isso compromete a performance em grande aplicações …

[quote=c#]no google vc acha bastante referencia sobre isso…
è pra fica mais rapido pois ele nao fica abrindo e fechando conexao toda hora isso compromete a performance em grande aplicações … [/quote]

O Hibernate é um framework que faz isso?

Não. Quem faz isso para ele é - em geral - o C3PO.

Até!

O meu programa é desktop e só vai ser acessado por um terminal alem do meu, se eu abrisse uma conexao só uma vez e deixasse aberta, isso diminuiria o uso de memória? Ou isso é ruim?