usuwanie tablicy z pamięci w trakcie działania programu...

0

jak wyżej...

Chodzi o to że mam aplikacje okienkową (desktopową). W okienku klikam przycisk i wyświetla mi się drugie okienko...W tym drugim okienku tworzę tablicę(nie wizualnie :) ). Chciałbym żeby po zamknięciu tego drugiego okienka ta tablica znikała z pamięci. Jak mozna ją usunąć? Moje drugie pytanie to: Obiekty umieszczane są na stercie w pamięci...Czyli tablice typu int[] a = new int[%]; rówież się tam znajdują?

pozdr.

0

Java sobie sama poradzi z takimi obiektami za pomocą GC, wystarczy że tablica wyjdzie z zasięgu.
W Javie prawie wszystkie dane są na stercie (nie dotyczy to oczywiście takich rzeczy które zawsze leżą na stosie jak adresy zwrotne po wywołaniu metody itd).

0

może ten kawałek kodu:

addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
a = null;
}
});

0

pomogło...:)
dziękować :)

Dlaczego bez wyzerowania tablicy , gdy chcę uruchomić po raz drugi to okno(co jest równe ponownym zapisem do tablicy ), wywala java cheap space. Przecież zapisuje nowe dane do tej samej tablicy..Ta tablica od razu mówię że jest dosyć duża(kilka milionów indexów).

0

Musisz pokazac kod. Mozliwe ze np gdy tworzysz nowa tablice trzymasz jeszcze stara, i na 2 nie styka juz miejsca.

0

Spróbuj wykonać
System.gc();
po wyzerowaniu tablicy może coś pomoże :)

0

wywołanie garbage collector nic nie dawało...Dopiero przy ustawieniu tej tablicy na wartość null (gdy opuszcamy okno), zadziałało. Kodu nie ma sensu wstawiać bo musiałbym "obcinać" kod co byłoby baardzo żmudne... Ważne że zachulało i dzięki wam za to :)

::. napisał(a)

Mozliwe ze np gdy tworzysz nowa tablice trzymasz jeszcze stara, i na 2 nie styka juz miejsca.

Faktycznie może o to chodzić...Tablica która jest w pamięci toche jej zajmuje...Otwierając ponownie okno, tworzę tablicę od nowa, która też waży swoje...
A jak to będzie z tą pamięcią...Jeżeli podczas działania aplikacji alokuje pamięć dla tablicy a później, alokuje ponownie pamięć dla tablicy o tej samej nazwie(oczywiście mówię tu o użyciu operatora new), to pamięć będzie przydzielona na miejsce tej poprzedniej czy zostanie stworzone dodatkowe miejsce? Czy w ogóle Java zorientuje się że ma już na stercie taką tablicę? A jeżeli się zorientuje to jak się zachowa?

Dzięki za help...

pozdr.

0

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.

0
Krolik napisał(a)

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.

Jak juz wczesniej napisano ;d

0

No właśnie starałem się uważać aby nie "dublować" tablic...Po umieszczeniu paru null'i z pamięcią nie ma już problemu...Zresztą mój błąd również polegał na tym, że za dużo niepotrzebnych informacji chciałem umieszczać w tablicach :)

Dzięki za pomoc :)

0

Czy przypisywanie w pętli null'i do wszystkich elementów tablicy (i jej samej) może okazać się szybszą metodą zwolnienia zasobów niż pozostawienie tego do sprawdzenia GC?

0

Nie powinno. Z drugiej strony gdzieś może być inna zmienna trzymająca referencję do tej tablicy. Jak już było napisane - GC nie zwalnia obiektów, do których są gdzieś przetrzymywane referencje (tzn nie do końca, bo powinien też dealokować osierocone cykle obiektów). A więc musisz się upewnić, że nie ma wiszących bezużytecznych referencji (które to blokują dealokację śmieci).

0

Jakkolwiek... kompilator i tak nie przepuścił podstawiania null'i do elementów tablic. Czy zna ktoś jakąś dobrą stronkę poświęconą GC, jego algorytmom oraz metodami ich doboru oraz parametrów JVM (najlepiej polskojęzyczną, bo dotychczas odwiedzone przeze mnie strony nie przedstawiły tego wystarczająco klarownie) ? Chodzi mi o to by spróbować jakoś dobrać technikę GC do tego co napisałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1