JInternalFrame e Garbage Collector

8 respostas
rmlang

Pessoal,

Estou utilizando JInternalFrame em uma aplicação e aindei pesquisando sobre
isso na net (google), onde encontrei algums comentários sobre problemas
com liberação de memória apos dar um dispose() nesse tipo de objeto.
Parece que o Garbage Colector não remove o JInternalFrame da memória
por estar ligado ao container e a eventos, etc.

Tenho uma situação onde uma classe JFrame instancia um JInternalFrame,
armazenando em um objeto dessa classe.

No JInternalFrame, quando o usuário finaliza o componente, tenho um
simples dispose(), que não altera a referência da classe JInternalFrame
para null, como eu esperava que fizesse.

A conseqüência disso é que na classe JFrame a referência da classe
JInternalFrame também não fica null.

Então, quando verifico se a classe JInternalFrame é null para cria-la
(a fim de criar apenas uma instância) ela sempre retorna a
referência anterior, ao invés de null, evitando que uma nova instância
de JInternalFrame seja criada e não trazendo a anterior, pois teóricamente
teria sido removida com o dispose().

Voltando ao assunto da pesquisa que fiz com o google:

https://lists.xcf.berkeley.edu/lists/advanced-java/1999-November/003014.html
http://www.javahelp.org/JInternalFrame_not_disposing-[telefone removido]-a.html
http://www.google.com.br/search?q=jinternalframe+dispose&hl=pt-BR&lr=&ie=UTF-8&start=10&sa=N

Citação retirada do primeiro link acima:

“Yes, JInternalFrames r not garbage collected properly, First of all remove
all the listeners frm the components, use ‘removeAll()’ method for every
container added on the internalframe even frm the ‘Container’ which u get
thru
getContentPane() method then dispose and set it to null, minimise the use of
anonymous classes. It will be better if u check the code thru OptimizeIt it
will help u know which classes r not getting GC.”

Achei que isso ficou um pouco vago e gostaria que alguém com mais
experiência na utilização destes componentes expressasse sua
opinião.

Será que utilizando no JInternalFrame a seqüência:

getContentPane().remove(this);

removeAll();

dispose();

estaria correto? Seria necessário tudo isso?

Existe uma forma de finalizar o JInternalFrame (nele mesmo) e transformar
sua referência em null a fim de reutilizar a referência deste objeto na
classe JFrame para criar uma nova instância quando necessário?

Outras sugestões?

[]'s

Robert

8 Respostas

brlima

Vc tah falando tudo isso com relação ao uso do InternalFrame dentro de um DesktopPane ou tah usando ele dentro do pane de um JFrame ???

Com relação a liberação de memoria, eu creio que o dispose não vai simplesmente “sumir” com todas as referencias de todas as variaveis apontsdas pra ele. Ele simplesmente tira o cara da tela e deixa ele quietinho na memoria como outro objeto qqer. No caso de um JFrame por exemplo, se a jvm so tem esse jframe aberto na tela, ao dar dispose, ele vai eliminar da tela, consequentemente elimina a sessão.

flw!

rmlang

Certamente.

brlima:
Com relação a liberação de memoria, eu creio que o dispose não vai simplesmente “sumir” com todas as referencias de todas as variaveis apontsdas pra ele. Ele simplesmente tira o cara da tela e deixa ele quietinho na memoria como outro objeto qqer. No caso de um JFrame por exemplo, se a jvm so tem esse jframe aberto na tela, ao dar dispose, ele vai eliminar da tela, consequentemente elimina a sessão.

flw!

Bruno, e vc utiliza simplesmente um dispose ou faz mais alguma coisa?

saoj

Só por desencargo de conciência: Vc está removendo ele do desktop pane ???

brlima

simplesmente dispose(), pra mim ja é o suficiente…
mas vc pode tentar usar o método remove() do desktoppane, passando o internalFrame que vc quer remover.

eu faço assim pra criar o internalframe:

JInternalFrame f = new JInternalFrame();
desktop.add(f);
f = null;

E ateh hj não tive problemas… e olha q eu tenho janela a beça…rssss…
Qdo sinto pesado, fecho algumas janelas e pronto, volta tudo ao normal, memoria liberada certinho…

flw!

brlima

Acho que qdo vc dá dispose() ele ja remove…

rmlang

Não, não estou removendo, apenas uso o dispose(), no JInternalFrame.

Não fui atrás de verificar o que está acontecendo com a memória, estou me baseando em fatos que encontrei na net e fiquei com essa dúvida.
Quero evitar futuros problemas de memória.

rmlang

brlima:
simplesmente dispose(), pra mim ja é o suficiente…
mas vc pode tentar usar o método remove() do desktoppane, passando o internalFrame que vc quer remover.

eu faço assim pra criar o internalframe:

JInternalFrame f = new JInternalFrame();
desktop.add(f);
f = null;

E ateh hj não tive problemas… e olha q eu tenho janela a beça…rssss…
Qdo sinto pesado, fecho algumas janelas e pronto, volta tudo ao normal, memoria liberada certinho…

flw!

E como eu posso a partir do código do JInternalFrame, setar o seu conteúdo para null a fim de no JFrame (com JDesktopPane), testar a variável que eu instanciei como null para que eu possa identificar que o JInternalFrame foi finalizado e criar uma nova instância?
(que rolo, hehehe) :smiley:

brlima

vc não “seta” o internalframe pra null, e sim as variaveis que apontam pra ele… bem dizem os livros que “um objeto é eliminado da memoria pelo GC quando não existem referencias de variaveis apontadas à ele”. Logo, se vc nao estiver mais apontando a nenhum lugar pro internalframe, ele vai sair da memoria pelo GC. Agora, se ele estiver aberto, vai ficar lá rodando. Qdo vier o dispose, vai eliminar a parte visual. Como não existe referencia na memoria o GC elimina ele da memoria.

Ele é um objeto como outro qqer no java, soh que este é visual, e enquanto ele existir na sua tela, nao vai ser eliminado da JVM, ateh que ele saia da tela ( pelo dispose ).

De resto funciona como qqer variavel e objeto. Assim como uma String.

flw!

Criado 24 de novembro de 2004
Ultima resposta 25 de nov. de 2004
Respostas 8
Participantes 3