Aplicações Java e uso de memória

Pessoal,

Estou de fato com uma pulga atrás da orelha com esse assunto. Eu tenho uma aplicação desktop em Java utilizando componentes swing, essa aplicação tem umas 3 ou 4 threads que, de tempo em tempo faz chamadas a um webservice, bom isso é apenas para contextualizar a situação, de fato podemos considerar como uma aplicação simples.

Essa minha aplicação consome em média 35mb de memória, eu ( e meu cliente ) achamos esse consumo muito alto e eu preciso de qualquer forma diminuir esse uso, a aplicação deveria rodar lindamente com menos de 15mb.

Após dezenas de otimizações e refactoring no código fonte do sistema eu consegui uma pequena melhora, algo em torno de 30, 33mb…

Então, após pensar “Meu código java é um lixo”, resolvi criar um simples projeto com apenas um jframe ( sem nenhum componente ), e após colocar essa aplicação para rodar tive a surpresa, esta aplicação teste com apenas um jframe consumia 15mb de memória…

Por curiosidade, estava no momento com o IReport aberto e resolvi verificar qual era o uso de memória dele. E o que constatei foi que o IReport aberto com 2 relatórios em edição consumia MENOS DE 3MB DE MEMÓRIA! SIM 3mb ( três megabytes ).

Agora vem a pergunta: Como isso é possivel? Porque minha aplicação Java de teste com apenas 1 Jframe consumia 15mb e o IReport com dezenas de compoentes e 2 relatórios abertos consome tão pouco? 3mb…???

No momento estou fazendo vários testes com parâmetros para definir o comportamento do coletor de lixo da JVM, mas pelo que vi os ganhos não serão tão expressivos como eu gostaria.

Fica ai meu relato e minha dúvida, espero que todos possam contribuir e quem sabe chegaremos aqui há em uma solução para otimizações de aplicações java Desktop no que diz respeito a uso de memória.

Abraços e até logo.

Rapaz, nem o executável da máquina virtual cabe em 3mb, você mediu alguma coisa errada aí com o iReport.

Marcelo, ele tá falando em espaço em memória, não físico.Em uso “latente” deve dar isso sim(apenas dando um oi ao gerenciador de tarefas hehe).

marpinheiro, use um profiler ou algum otimizador, mas pelo que vc está me descrevendo, os 30MB me parecem razoáveis.
Eu já tive aplicações(SWING) que quando eu deixava ela em “suspenso”(aberta, mas sem tocála/mexer nos campos botões etc) dava 1MB(Ambiente Windows), mas aprtir do momento em que eu começava a usar, “disparava” para 20,30…já inclusive passei um “perrengue” de tomar um OutOfMemory error numa apresentação, pq um gráfico exibido tinha 1600x1200 e estourou a heap da JVM do servidor(Não tava configurada, tava usando o mínimo…e me f…).Esses 3MB devem ser a aplicação em inatividade completa não?Apenas “esquecida” na sua barra de tarefas ou algo assim?Lembre-se: “estar aberto”, é uma coisa.Em manipulação/uso é outra.

Acho é que você está usando pouco. Ponha mais memória na máquina.

Isso está sendo um problema para você?
Ou vocês notaram o fato por acasao, acharam ruim e estão perseguindo a solução de uma coisa que, de fato, não é um problema?

O Java é comilão de memória mesmo. A VM ocupa espaço e ainda reserva uma área que cresce exponencialmente.
Agora, 30mb não era para ser uma preocupação hoje em dia.

Pois é, de fato 30mb não parece muito… O problema é que a aplicação é um comunicador ( chat ) que vai rodar em uma empresa de software que possui cerca de 40 analistas que trabalham em maquinas com 1… 2gb de memória, por outro lado vai rodar em clientes que utilizam o ERP desta empresa que possui lindas e maravilhosas máquinas com 256mb e lá no meio bem escondido deve ter alguma com 128mb…

E é ai que começa a ficar complicado, pois imagine se minha aplicação “comer” 40mb, vai sobrar quanto para rodar o ERP que o usuário precisa estar com ele aberto o dia todo… sem contar é claro outras aplicações que o usuário pode vir a abrir…

Andei lendo alguma coisa por ai que componentes AWT trabalham melhor do que componentes SWING e consomem menos memória, etc… Apartir disso fiz um teste de uma aplicação com AWT e SWING, e deu sim uma diferença no uso de memória: 1M :frowning:

É um caso complicado…

Alguém sugere algo?

concordo com o ViniGodoy…

quando tava cosntruindo umas janela aqui em swing eu reparei q o meu JFileChooser ao ser chamado consome 8 mega de memoria… na hora eu achei muito mais ai depois pensei um pouco… muito, na verdade “é”, mais os pcs atuais tem la por 1 giga de memoria…

o pc do seu cliente tem quanto?? 512??? é não chega a estar ruim mais esta ficando desatualizado…

po…agora q li seu ultimo post…

olha o problema em si não é vc… 40 mega de memoria sendo usados por um programa em java com ambiente grafico… não é muito pra um programa robusto…

nós temos um problema, interface grafica em java “é” pesada e não ha nada que vc possa fazer… esse é um dos motivos pelos quais eu procurei bastante recentemente por aplicativos que transformem o .class (ou jar) em exe (alem do principal, que é evitar instalar a jre), pois ouvi falar em certo topico aki do guj que o desempenho aumentou muito tanto em ambiente grafico quanto de IO (que tb é outro ladrão de memoria em java mais na minha opinião não é tanto quanto swing)…

o caso é que testei uns 4 ou 5 programas que prometem isso mais nenhum foi plenamente satisfatorio, a velocidade dos programas não melhorou significativamente e não consegui rodar esses aplicativos em maquinas sem a jre.

depois disso cheguei a conclusão de que java esta focado a servidores (que aliais não tem esse problema com memoria), e que esses ambiente graficos em java não são muito alem de quebra-galho…

pense em um ambiente swing que faça isso ai que vc faz e depois pense em uma pagina jsp usando de ajax no meio…

java não foi feito para maquinas com 256 de ram… o jeito é agente se conforma

Olá pessoal,

acabo de ler as respostas de vocês e já desanimei, eu estava começando a procurar um solução para esse problema mas depois dessas nem vou mais.

Eu também estou com esse problema fiz a pouco tempo um aplicativinho insignificante, que usa apenas 1thread
O objetivo dele é exibir um aviso na tela dos usuários de 1 em 1 hora. Até antes de chamar a única JFrame dele a aplicação consome 6,80MB de memória, agora quando ele carrega o swing pula para 17,5MB.

Agora eu vou tentar fazer essa alteração que vocês comentaram, trocar o swing por awt.

Agora eu pergunto a todos, alguém sabe me dizer se tem como rodar uma aplicação Java no servidor e ele transmitir para estações de trabalho(no caso estações de trabalho são terminais burros).

Aqui na empresa trabalhamos com servidores de PC-Expanion onde eu posso pendurar até 30 terminais burros por servidor. o PC-Expanion instância o Windows de forma que cada pessoa pode entrar com seu usuário e usar ao mesmo tempo. ou senha se 1 usuário roda 10 processos e usa 100mb com 30 usuários terei 300 processos com 3GB de ram que é +ou- o meu caso.
Se eu colocar minha aplicação java para rodar por usuário será 17mb*30= 510mb de RAM sendo que cada servidor possui 4Gb.

se eu simplesmente puder rodar a minha aplicação apenas no servidor e ele apenas exibir para os terminais não terei problema.

esse é meu desafio… alguém se habilita :lol:

muito obrigado a todos pela atenção

em mono usuario é possivel abrir 30 vezes a app e consurmir os mesmos 17 megas.

mas o problema é fazer isso em modo multi-usuario… pois o So aloca uma JVM pra cada user