Diminuir memória de aplicativo

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?

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:

  1. voce inicia aplicação com 10mb
  2. dai voce carrega uma imagem pela aplicação, a memoria subiu para 30mb
  3. 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.