[quote=ceklock]Por que terá que deixar janela1 null?
Nesse caso que você citou acima quando chamar abrirJanela1() a próxima janela vai automaticamente ocupar o lugar da anterior (a variável janela1 vai receber um novo objeto), e a anterior vai perder referencia, desde que vc chame dispose() ao fechar a janela (use setDefaultCloseOperation(DISPOSE_ON_CLOSE) ). [/quote]
Você deve setar como null porque aquela variável não sai do escopo. Se o menu tiver 50 janelas, e cada uma for aberta uma vez, haverá 50 janelas na memória ao final do processo, mesmo que todas tenham sido fechadas!
De qualquer forma, com o que você falou, só vai haver a coleta da memória da janela anterior, quando a nova for aberta. Ou seja, no sistema, haverá pelo menos uma janela daquele tipo ocupando memória, a partir do momento que ela for aberta a primeira vez.
E estamos falando exatamente sobre se certificar que essa memória foi coletada!
Eu até concordo que, no geral, você pode usar a memória dessa forma relaxada, pois janelas tipicamente não ocupam tanta memória assim. Mas não é disso que o tópico se trata. Estamos falando no escopo do dispose() e em como garantir que toda a memória da janela foi desocupada.
[quote]E um JInternalFrame não é uma janela de verdade, é um componente leve. E pra que ficar setando janelas como null? O melhor é deixar só invisivel mesmo, e reutilizar depois. Afinal, é uma interface gráfica. Tu só vai se livrar de janelas se for estritamente necessário.
[/quote]
Se ele é leve ou não depende dos componentes que tem dentro. No post do problema que citei, o usuário abria uma imagem, um recurso grande e pesado. O frame invisível continuará com a imagem lá. Se a janela carregou em suas variáveis internas vídeos, música ou outros recursos pesados, esses recursos vão continuar lá, ocupando memória junto.
Por isso é importante saber quando e como janelas são realmente limpas, e onde é o papel do dispose, onde é o do gc() e como garantir que os dois rodem adequadamente.
Verdade. Mas é bom saber que o que fazer caso você perceba que o leak é nas janelas fechadas. 