A nie robisz aby czegoś takiego:
class MojaKlasa {
private int[] bardzoDuzaTablica;
public otworzOkienko() {
bardzoDuzaTablica = new ... // stworzenie bardzo dużej tablicy i wypełnienie danymi
//...
}
}
?
Przy takim kodzie przy drugim wywołaniu funkcji otworzOkienko, jeśli nie wynullujesz referencji do bardzoDuzaTablica, to przez moment masz w pamięci 2 tablice.
GC nie może usunąć pamięci po starej tablicy dopóki nie nastąpi przypisanie do nowej, a przypisanie owo nastąpić musi po alokacji nowej tablicy, czyli przez moment muszą być dwie. Wynullowanie tablicy po zamknięciu okienka jest bardzo dobrym rozwiązaniem, a jeszcze lepszym zorganizowanie struktury klas tak, aby obiekty klasy MojaKlasa miała czas życia taki sam jak okienka (tj. wychodziły z zasięgu po zamknięciu okienka).
Co do pytania o to, czy Java ponownie używa tej samej pamięci, to jeśli nową tablicę zaalokujesz po tym jak GC posprząta, to pamięć po starej tablicy zostanie ponownie użyta.