Olá, meu problema é o seguinte:
Por curiosidade eu fui ver quanto de memória estava sendo usada na minha aplicação quando ela abre, no caso apenas o frame principal aberto, estava sendo usado 19Mb de memória, ai então eu redimensionei o frame e estranhamente a aplicação passou a consumir 30Mb… Acredito que este aumento de memória se da por eu ter um fundo gradiente no meu frame que atualiza quando é redimensionado, o problema é que depois de redimensionar a memória não volta mais pra 19Mb, nunca mais, não tem jeito. Alguém sabe como eu posso limpar esta memória pra voltar pra 19Mb?
Diminuir memória de aplicativo
10 Respostas
Use uma outra linguagem - Java não é conhecida por ser econômica com memória.
De fato, para evitar uso muito acentuado de memória, você acaba tendo de limitar muito a parte visual de seu aplicativo.
Sim, percebi que Java realmente não é econômico em memória, mas enfim, agora a aplicação já esta feita em Java, e minha dúvida é um tanto quanto didática. Queria mesmo é saber porque a danada não volta pra 19Mb depois de pintar o Panel…
O gerenciamento de memória se trabalha na JVM, não na aplicação.
Você pode usar ferramentas para analisar o comportamento da sua aplicação como por exemplo o http://www.jvmmonitor.org/
Obrigado Giulliano, vou dar uma olhadinha nesse jvmmonitor. Essa função de liberar memória quem tem que fazer é o Garbage Collector?
Talvez estaja criando objetos ‘grandes’ ou objetos estão 'amarrados em métodos ‘grandes’. Se possivel de uma lida no capitulo 2 deste livro: http://www.arquiteturajava.com.br/ é pequeno e com poucas páginas.
próprio jdk já vem com um monitor: jconsole (procura na pasta bin do jdk)
voce conecta atraves do jconsole na sua aplicação (aplicação tem que estar sendo executada) e consegue monitorar consumo de memoria e outras coisas
você vai perceber que se sua aplicação precisou utilizar 30mb, a jvm vai alocar esses 30mb, porém caso sua aplicação diminua o consumo para 19mb, a jvm permanece com o consumo de 30mb (19mb que sua aplicação esta utilizando e 11mb para caso precise novamente ).
JVM vai alocar memoria até o max que foi definido pelo parâmetro -Xmx
abraços
Huum então é por isso, não sabia que a jvm reservava memória mesmo não estando em uso… de todo modo vou olhar esse jconsole, ainda não o conheço. Obrigado lucasirc. A jvm faz isso para ter mais performance? tipo caso volte a precisar de memória fará isso mais rápido já que esta reservada?
ela mantem reservado essa diferença de memoria que voce precisou. Por exemplo:
- voce inicia aplicação com 10mb
- dai voce carrega uma imagem pela aplicação, a memoria subiu para 30mb
- clica em ‘salvar’, dai voce ‘desalocou’ a memoria que gastou (imagem = null) e garbage collector já fez o ‘servico dele’
utilizando o jconsole voce vai perceber que a memoria utilizada pela aplicação voltou para 10mb, porém a jvm ainda está com os 30mb alocados, ela supoe que voce vai precisar de 10mb no futuro, e como voce disse, ela faz isso para melhorar a performance mantendo alocado esses 20mb a mais
Aham blz então… achei que fosse um problema da minha aplicação, tipo o fundo eu faço assim quando redimensiona eu coloquei um gradiente no paintComponent do JPanel para pegar a altura e largura e refazer o gradiente. Será que é a melhor forma de fazer?
É normal consumir essa quantia de mem. quando se usa swing. Para monitorar oque cada tipo de objeto está consumindo de mem. vc pode usar o jvisualvm do seu JDK.