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?
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.
quebrado
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.
Jorgev
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.
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:
public class TelaInicial{...
public static OutraTela tela = null;
.......
depois que eu fecho a tela, eu passo o paramentro pra tela inicial assim:
TelaInicial.tela = null;
O que achas?
davidtiagoconceicao
É 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.
Jorgev
mas não tem nenhuma maneira de ir diminuindo esse consumo?
c113
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 …
Jorgev
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 …
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?
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.
Jorgev
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.
Como assim eliminar referências?
davidtiagoconceicao
Jorgev:
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.
Como assim eliminar referências?
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.
c113
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?
Jorgev
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
Jorgev
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?
Eu tou abrindo e fechando toda hora.
c113
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
Jorgev
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?
c113
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 …
Jorgev
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 …
O Hibernate é um framework que faz isso?
maquiavelbona
Não. Quem faz isso para ele é - em geral - o C3PO.
Até!
Jorgev
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?
maquiavelbona
Em geral, abrir uma conexão e mantê-la aberta não é ruim mas se o uso for muito esporádico, a conexão pode morrer e você ter problemas achando que é o servidor SQL. Uma coisa legal seria você centralizar todas as buscas em um único servidor e o mesmo retornando os dados da busca, aí quem teria que se preocupar com múltiplas conexões seria somente um serviço.