Liberando Memória após sair do frame

10 respostas
L

Boa tarde pessoal,

Achei muita coisa sobre este assunto aki no forum, porém nenhum ajudou.
Olha só. Tenho um frame que quando entro nele, o consumo da memória para o processo em execução vai para 120mb, até ai tudo bem, mas quando eu saio do frame, a memória não cai e se eu entro de novo no frame, ele consome mais memória.
Pergunta, como libero a memória após sair deste frame?

Segue a função que chama o frame com algumas tentativas q fiz para liberar a memória, mas sem sucesso

EntradaMovimento frmEntrada = null;
        frmEntrada = new EntradaMovimento(null, true, null, codFilial, codTmv, ttmv, null);
        frmEntrada.setVisible(true);
        frmEntrada.setVisible(false);
        frmEntrada.dispose();
        frmEntrada = null;
        System.gc();

Obrigado

10 Respostas

W

LucasGCosta:
Boa tarde pessoal,

Achei muita coisa sobre este assunto aki no forum, porém nenhum ajudou.
Olha só. Tenho um frame que quando entro nele, o consumo da memória para o processo em execução vai para 120mb, até ai tudo bem, mas quando eu saio do frame, a memória não cai e se eu entro de novo no frame, ele consome mais memória.
Pergunta, como libero a memória após sair deste frame?

Segue a função que chama o frame com algumas tentativas q fiz para liberar a memória, mas sem sucesso

EntradaMovimento frmEntrada = null;
        frmEntrada = new EntradaMovimento(null, true, null, codFilial, codTmv, ttmv, null);
        frmEntrada.setVisible(true);
        frmEntrada.setVisible(false);
        frmEntrada.dispose();
        frmEntrada = null;
        System.gc();

Obrigado

Olá,

Dá uma olhada nesse pdf, pois pode te ajudar.

http://www.arquiteturajava.com.br/livro/principios-de-garbage-collection.pdf

I

Leia o artigo que worldsoft te indicou e leia este daqui também :arrow: Introdução ao Garbage Collector

:thumbup:

M

Bom pela descricao do seu problema
me parece que falta vc finalizar a execucao do frame
pelo seu codigo isso nao ficou muito claro.

new JFrame().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Mas com este comando logo apos a janela se fechar
ira finalizar a execucao.

L

Li o artigo sobre o GC, não consegui resolver o meu problema, mas pelo menos entendi o que esta acontecendo.
Ok amigos, obrigado.

I

LucasGCosta:

Li o artigo sobre o GC, não consegui resolver o meu problema, mas pelo menos entendi o que esta acontecendo.
Ok amigos, obrigado.

Mas você não conseguirá resolver o problema desta maneira:

frmEntrada.setVisible(false); //somente oculta o JFrame, portanto desnecessário.

frmEntrada.dispose(); //basta chamar somente este método.

frmEntrada = null; //o dispose já “faz isto”.

System.gc(); //só sugere que o GC “passe”, mas não obriga.

Como você pode ver, basta chamar o método dispose…

…e o mais importante que não tenha nenhuma variável apontando para este objeto (JFrame), para que quando o GC passar (na hora que ele achar necessário) remover este objeto da memória.

:thumbup:

V

Não é o dispose que faz isso, mas o fato da variável sair de escopo ao final do método (ela foi criada como uma variável local). Por isso, esse comando não é mesmo necessário, nesse caso.

Agora, se seu JFrame estiver mesmo ocupando memória, certifique-se que não há nenhuma variável estática apontando para ele, ou para qualquer um dos componentes dele.

Além disso, seria bom entender que existem 2 memórias quando falamos em Java:

  1. A memória que seu aplicativo java tem disponível para executar (que é pré-alocada pela VM, e pode crescer com o tempo);
  2. A memória que a VM utiliza no SO.

Quando a gc() roda,ele libera apenas a memória interna da VM (a pré-alocada), usada por seu programa, sem necessariamente desalocar essa memória do SO.

Essa coleta só ocorre raramente, caso a memória fique ociosa por muito tempo. Há como configurar a política, mas isso certamente terá impacto no desempenho da VM:
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

O que vai ocorrer é que seu frame foi liberado, embora a memória do SO baixe, não irá também aumentar quando novos objetos forem utilizados, já que esse espaço liberado será reutilizado.

J

ViniGodoy:
InicianteJavaHenrique:

frmEntrada.dispose(); //basta chamar somente este método.

Não é o dispose que faz isso, mas o fato da variável sair de escopo ao final do método (ela foi criada como uma variável local). Por isso, esse comando não é mesmo necessário, nesse caso.

Agora, se seu JFrame estiver mesmo ocupando memória, certifique-se que não há nenhuma variável estática apontando para ele, ou para qualquer um dos componentes dele.

Além disso, seria bom entender que existem 2 memórias quando falamos em Java:

  1. A memória que seu aplicativo java tem disponível para executar (que é pré-alocada pela VM, e pode crescer com o tempo);
  2. A memória que a VM utiliza no SO.

Quando a gc() roda,ele libera apenas a memória interna da VM (a pré-alocada), usada por seu programa, sem necessariamente desalocar essa memória do SO.

Essa coleta só ocorre raramente, caso a memória fique ociosa por muito tempo. Há como configurar a política, mas isso certamente terá impacto no desempenho da VM:
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

O que vai ocorrer é que seu frame foi liberado, embora a memória do SO baixe, não irá também aumentar quando novos objetos forem utilizados, já que esse espaço liberado será reutilizado.

Se for o coletor de lixo antigo(java 1.6) essa memória pode não ser liberada e o espaço alocado fica marcado para ser usado por outro objeto semelhante(outro jframe). Isso faz o programa ganhar desempenho. O que não pode acontecer é você carregar o jframe outra vez e ele duplicar o espaço alocado. Isso já é um memory leak.

G

eh, mas pelo q entendi, o prb dele é justamente esse: alem de não desalocar, realoca qdo chama o mesmo frame novamente.

V
Nesse caso é fácil.

a) Abre o Visual VM;

b) Abre o Frame;

c) Fecha o frame;

d) Força a execução do GC;

e) Analisa a memória. Provavelmente vai estar lá a instância do frame antiga. Manda o profiler rastrear quem está segurando ela viva. E vai no código e corrige o cara que deveria estar limpando a referência.
L

Entendi, vou fazer isso e posto o resultado em breve.
Obrigado.

Criado 27 de julho de 2012
Ultima resposta 30 de jul. de 2012
Respostas 10
Participantes 7