2011-10-14 12 views
6

Piszemy dużą aplikację GUI w Scali z wieloma klasami i musieliśmy zwiększyć przestrzeń PermGen, aby móc załadować wszystkie klasy. Sama aplikacja pokazuje serię ekranowych działań, z których każda ładuje swój własny duży zestaw klas. Tylko jedna czynność jest kiedykolwiek załadowana/wyświetlana w dowolnym momencie. Po przejściu kilku czynności, mieliśmy OutOfMemoryError w przestrzeni PermGen.Zapisywanie przestrzeni PermGen przy użyciu wielu programów ładujących klasy

Rozumiem, że przestrzeń PermGen to garbage collected just like the rest of the heap, ale jestem zainteresowany, czy mogę zmniejszyć wymaganą przestrzeń PermGen przez posiadanie np. jeden na jedną aktywność, aby umożliwić rozładunek klasy.

Więc:

  1. Rozumiem, że klasy ładowane przez classloader system nie może zostać rozładowane, ponieważ będą one zawsze odwoływać ich ładującego klasy. Czy to prawda?
  2. Pod warunkiem, że nie ma więcej wystąpień klasy załadowanej przez mój niestandardowy moduł ładujący klasy, a moduł ładujący klasy może być zbędny, czy jego klasy zostaną rozładowane, zwalniając przestrzeń PermGen?
  3. Czy są jakieś zastrzeżenia dotyczące (lub typowych błędów, które uniemożliwiałyby) rozładunek klasy?
+0

Jak duży jest twój PermGen? –

+0

128m to za mało, na razie działa 256m, ale jak długo? ... –

Odpowiedz

6

... jeśli mogę zmniejszyć wymaganą przestrzeń PermGen przez posiadanie np. jedną klasę ClassLoader na działanie, aby umożliwić rozładowanie klasy.

Tak, jedynym sposobem Klasy są uprawnieni do rozładunku jest, jeśli jest stosowany classloader śmieci zebrane. Oznacza to, że odniesienia do każdej z klas i do samego modułu ładowania klas muszą wynosić zero.

Jak duży jest twój PermGen? Możesz uciec, po prostu podskakując PermGen z:

-XX:MaxPermGen=256m 

w linii poleceń. Często zdarza się, że jest ustawiony na 512 metrów. Jeśli chcesz naprawdę niezawodne rozwiązanie, musisz przejść do trasy niestandardowego programu ładującego klasy na "aktywność". Aby pomóc z debugowania, należy dodać następujące wymowne argument linii poleceń jak:

-XX:+TraceClassLoading 

To będzie drukować zajęcia, ponieważ są one ładowane do JVM do linii poleceń.

+0

Dzięki za odpowiedź. Wygląda na to, że '-XX: + TraceClassloading' nie jest dostępny w mojej wersji JRE 1.6.0_26 na Mac OS X; jakaś wymiana? –

+0

-XX: + TraceClassLoading –

+0

OK, to działa, dziękuję. Używam również '-XX: + TraceClassUnloading' teraz. –