Olá pessoal…
Para ter um JFrame que encerre toda a aplicação, a propriedade DefaultCloseOperation dele deve estar configurada como EXIT_ON_CLOSE.
Para ter um JFrame que não encerre toda a aplicação, que simplesmente se feche, a propriedade DefaultCloseOperation dele deve estar configurada como DISPOSE_ON_CLOSE.
Lembrando que no NetBeans, é possível alterar essa propriedade clicando com o botão direito do mouse sobre o JFrame em questão e na aba Properties é a primeira propriedade.
No caso de se ter um botão para fechar o JFrame, os códigos:
System.exit(0); encerra a aplicação.
this.dispose(); fecha somente o JFrame em questão, onde this = JFrame.
O método setVisible(); serve somente para exibir ou não o JFrame na tela.
Quanto a alocação e liberação do espaço de memória alocado, é a propria JVM que irá fazer através dos recursos de GarbageCollector, e no momento que ela julgar ser o melhor para não prejudicar a performance do sistema, ela irá remover todo objeto que não possui mais referências e liberar o espaço de memória que foi alocado para ele.
http://www.guj.com.br/java.tutorial.artigo.28.1.guj (Muito interessante tbem)
Espero ter ajudado pessoal, vlw t+