deixa o garbage collector trabalhar…

acabei de ter um problema com memória no java…

trabalho com compressão de imagens mamograficas (gigantes, 30MB em média por imagem), e meu codigo estava dando uns estouros de memoria, mesmo com a memoria da máquina virtual aumentada para 256M.

fui olhando meu codigo principal do compressor… e tinha lah +- assim…

Imagem imagem = AbrirImagem(file);
Compressor compressor = new Compressor(imagem, filecomprimido);
compressor.comprimir();
Descompressor descompressor = new Descompressor(filecomprimido);
Imagem imagemDescomprimida = descompressor.comprimir();

O problema ai é o seguinte, o compressor precisa de muita memoria! e o descompressor também!!! mas eu tenho que descomprimir e descomprimir pra saber se tah tudo OK. (sempre comparo o arquivo original e o descomprimido pra ver se são iguais)

Minha soluçao para o problema de memoria foi: na descompressao nao preciso de nenhuma informação do compressor, nao uso ele em lugar nenhum mais! Mas como a referência do compressor continua no codigo o GC (Garbage Collector) do java não pode remove-lo da memoria!!!😮

Vejam minha solução para isso:

Imagem imagem = AbrirImagem(file);
{
    Compressor compressor = new Compressor(imagem, filecomprimido);
    compressor.comprimir();
}
Imagem imagemDescomprimida;
{
    Descompressor descompressor = new Descompressor(filecomprimido);
    imagemDescomprimida = descompressor.comprimir();
}

Com essa modificaçao simples (adicionar as chaves) isolei o compressor e o descompressor do resto do codigo! Depois que a execução sair do blodo de codigo as referencias do compressor e descompressao naão são mais válidas (estão fora de escopo)! Entao o GC pode remover seus objetos da memoria!

Pra quem não sabe como funciona o GC do java, ele remove objetos que não possuem nenhuma referencia!!! No codigo original, depois da compressao da imagem, a referencia ao objeto COMPRESSOR continuava lah, e por isso o objeto nao podia ser removido pelo GC.

Para aumentar a memoria do java, basta você adicionar a opçao -Xmx# na chamada do comando java

Ex:

  • java -Xmx256m NomeDaClasse -> configura a memoria máxima que a JVM pode utilizar em 256MB
  • java -Xms100m NomeDaClasse -> configura a memoria inicial da JVM em 100MB

Saber isolar as referencias (tira-las de escopo) pode ser importante na hora de desenvolver algum programa que coma muita memoria! =)

0 Responses to “deixa o garbage collector trabalhar…”



  1. Deixe um comentário

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s





%d blogueiros gostam disto: