Só para complementar o que o Sombriks disse, essa opção do JFrame instrui o Garbage Colector do JDK para apagar da memória as variáveis criadas durante o runtime. Se isso não for feito, cada vez que você roda o programa, como bem disse o Sombriks, será ocupado mais e mais espaço da memória.
brother, usar o método setDefultCloseOperation(JFrame.EXIT_ON_CLOSE); não tem nada haver com o coletor de lixo. Esse método como o sobrinks disse é um método de conveniência para que não seja necessário registrar um listener para ouvir o evento de fechamento da janela em questão e ao ser ouvido chamar um System.exit(0).
Não tem como vc invocar a execução do coletor de lixo diretamente e ter certeza que este será executado.
Para “sugerir” à máquina virtual que ela execute o coletor de lixo pode-se usar System.gc(), mas como falei não há nenhuma garantia que ele seja executado.
O coletor de lixo é automático, a jvm o executa quando necessário. É claro que quando o usuário fechar a janela e finalizar o programa todo o processo será discartado, levando consigo todos os objetos criados. O coletor de lixo é executado quando finaliza-se algum método, etc, não tem como ter um controle preciso sobre o mesmo. Só é possível sugerir sua execuçã, nada mais.
Se não for usado o setDefultCloseOperation(JFrame.EXIT_ON_CLOSE) o frame ficará invisível, mas o processo como um todo aind estará ativo, e o coletor de lixo não será executado a não ser que haja necessidade, creio que nem mesmo o JFrame será discartado, pois sua execução ainda não foi terminada.
se vc nao colocar essa linha, a JVM não termina. Faz um teste pra vc entender: Abra e feche seu programa 3 vezes sem essa linha. Aí depois da uma olhada (no Gerenciador de tarefas) nos processos abertos. Vc vai ver 3 instancias do java rodando.