Uso de memória

Bom dia pessoal, tudo bem??

Seguinte, tenho que fazer um trabalho na faculdade de leitura de arquivos BMP. Fiz tudo a leitura dos bytes dos arquivos e exibos eles no jpanel sem problemas, ou seja, funciona.

Uso jinternalFrame pra exibir cada imagem numa subjanela dentro da minha aplicação, funcionando também sem problemas.
Mas se eu abro uma imagem bem grande e pesada(BMP é um arquivo de imagem sem compressão), o consumo de memória vai nas alturas.
Ok, isso já era esperado.

A questão é que se eu abro uma imagem, carrego ela bonito, exibo, fecho a janela(mato o objeto) e forço a execução do garbage collector e o consumo de memória continua usado como a imagem estivesse carregada ainda. Aí abrindo umas 3 imagens grandes, da o estouro da pilha…

O que eu faço para ele limpar???

Outra coisa, meio básico, qual a melhor maneira de fechar uma janela? Eu vi que o dispose() só oculta a janela na visualização. Tem algum método que mata a janela?

abraços e obrigado!

é, você não consegue forçar a execução do Garbage Collector, você apenas sugere a execução, e a JVM que decide se executa ou não, mas pelo que você está descrevendo, você provavelmente ainda tem referências à essa imagem quando fecha a janela.

Só dar setVisible(false) ou dispose() não retira a janela da memória.

Para ela sair da memória, você terá que eliminar todas as referências à janela (deixa-las null), para só então rodar o gargabe collector.
Então, certifique-se de estar removendo a janela de dentro do DesktopPane, e deixando null qualquer variável que aponte para a janela.

É só questão de descarregar da memória as imagens que foram carregadas.

Não vi o código fonte, portanto não sei dizer como remover essas imagens. Mas seria algo assim:

  • remove a imagem da janela (depende de como você desenhou/exibiu a imagem);
  • descarrega a imagem / limpa buffer;

Olá, então a exibição que se faz é pintando pixel a pixel um jpanel… Eu ja desaloquei minhas estruturas na hora que eu dou o comando pra fechar a jInternalFrame(variavel =null), dou null no objeto que referencia a jInternalFrame e mandava executar o GC… QUandom mando executar o GC o consumo de memória aumenta ainda mais, a aplicação fica travada até ele terminar de executar e não limpa a memória.

Não sei mais o que fazer…

Retirou o internal frame de dentro do desktop pane?

Se nem isso resolver, baixe um profiler como o do netbeans, tire um dump da memória e veja o que ainda está referenciando sua janela.

Fica difícil tentar ajudar sem ver o código fonte. Cadê esse código fonte?