Wpis z mikrobloga

@FrancMauer: ten kod alokuje tablice o wielkościach 1MB, 2MB ... 64MB, to daje sumę ~160MB. Dodatkowo tworzysz adjacencyList które zajmują około połowę tego co adjacencyMatrix, czyli ~80MB. Mamy już 240MB a standardowa ilość pamięci w javie to 256MB. Doliczmy do tego jakiś narzut i mamy koniec pamięci.
@FrancMauer: możesz spróbować wrzucić System.gc() na początku pętli, wtedy jest szansa, że garbage collector usunie poprzednio stworzone obiekty i zrobi miejsce na nowe.
@FrancMauer: Wydaje mi się, że @uuid trochę źle liczy, bo te stare grafy powinny się odśmiecać (ale może nie, nie znam Javy), ale za to nie dolicza wielkości adjacencyList, które trzyma inty zamiast booli - czyli 4 lub 8 razy więcej miejsca, o ile Java nie trzyma tego w ogóle jako referencji (wtedy jeszcze więcej). Dodatkowo musisz policzyć, że DFS może się zagłębiać na te parę tys. wywołań, co też swoje
Dodatkowo musisz policzyć, że DFS może się zagłębiać na te parę tys. wywołań, co też swoje zajmuje. Ogólnie - w cholerę miejsca na to potrzebujesz.


@frax: wiem, myślałem, ze coś źle zrobiłem, miałem nadzieje że ktoś znajdzie błąd :)
@FrancMauer: Nie powiem, żebym to dokładnie czytał, ale nic się w oczy nie rzuca, a jeśli wywala się przy ósmym obrocie, no to raczej generalnie działa. Możesz spróbować z tym System.gc(), może pomoże. Możesz też zwiększyć dopuszczalną wielkość sterty opcją -Xmx jvm-a, np. -Xmx2048m ustawi maksymalną pamięć na 2048 MB (nie wiem, ile jest domyślnie, i to chyba może zależeć od ilości RAMu w twojej maszynie).
@Szab: No tak, ale spodziewałbym się wywołania go, kiedy zaczyna brakować pamięci, zanim się rzuci wyjątkiem... Chociaż może samo odśmiecanie wymaga jej już za dużo :P
@FrancMauer: nulluj na koniec pętli:

MatrixGraph mgr = null;
ListGraph lgr = null;

Podpowiesz zbieraczowi smieci, że może to zabrać zamiast sam do tego dochodzić.

Kiedyś miałem taki kawałek:

for(Obiekt o : kolekcja ){
String s = new String();
wynik = operacjaNaObiekcie( o );
operacjcjaNaStringu( s, wynik );

// s = null;
}

I też mi leciało out of memory, gc nie nadążał odśmiecać. Problem zniknął gdy nullowałem stringa przed zakończeniem
@FrancMauer: przejrzałem pobieżnie te klasy. z metod toString wyciągnoł bym tego stringbulidera do konstruktora i nie tworzył go za każdym razem tylko w metodzie toString pierwsza linika to stringbuilder.setLenght( 0 )

dynamiczne listy, też jak dasz radę to przenieś do konstruktora i czyść przed każdym użyciem