Co robi -XX: MaxPermSize?

260

W szczególności, dlaczego miałby pomóc rozwiązać problem PermGen OutOfMemoryError?

Ponadto punkty bonusowe za odpowiedź, która kieruje mnie do dokumentacji argumentów JVM ...

Geoff
źródło
6
oracle.com/technetwork/java/javase/tech/… Jak teraz otrzymacie te dodatkowe punkty? :)
Denys Séguret
1
@PaulTomblin Nie jestem pewien, czy facet, do którego linkujesz (pierwszy wynik Google), ma pojęcie o tym, o czym mówi.
Denys Séguret,
@dystroy Mogę wysłać ciasteczko? Lub możesz po prostu zadowolić się pytaniem, na które dobrze odpowiedziałeś;)
Geoff,
5
To nie odpowiada konkretnie na pytanie, ale jeśli patrzysz na zarządzanie pamięcią JVM, najlepsze artykuły, które przeczytałem na ten temat, to ten i ten link infoq
Abe

Odpowiedzi:

273

Stała przestrzeń to miejsce, w którym klasy, metody, internalizowane łańcuchy i podobne obiekty używane przez maszynę wirtualną są przechowywane i nigdy nie są zwalniane (stąd nazwa).

W tym artykule Oracle zwięźle przedstawiono działanie i parametryzację HotSpot GC i zaleca się powiększenie tego miejsca, jeśli załadujesz wiele klas (zwykle tak jest w przypadku serwerów aplikacji i niektórych IDE, takich jak Eclipse):

Ciągłe generowanie nie ma zauważalnego wpływu na wydajność modułu wyrzucania elementów bezużytecznych w przypadku większości aplikacji. Jednak niektóre aplikacje dynamicznie generują i ładują wiele klas; na przykład niektóre implementacje stron JavaServer Pages (JSP). Aplikacje te mogą wymagać większej stałej generacji do przechowywania dodatkowych klas. Jeśli tak, maksymalny stały rozmiar generacji można zwiększyć za pomocą opcji wiersza polecenia -XX: MaxPermSize =.

Zauważ, że w tej innej dokumentacji Oracle wymieniono inne argumenty HotSpot.

Aktualizacja: Począwszy od Java 8, zarówno przestrzeń permgen, jak i to ustawienie zniknęły. Model pamięci używany dla załadowanych klas i metod jest inny i nie jest ograniczony (z ustawieniami domyślnymi). Ten błąd nie powinien już być wyświetlany.

Denys Séguret
źródło
93

-XX:PermSize -XX:MaxPermSize są używane do ustawienia rozmiaru dla generowania ciągłego.

Permanent Generation: Permanent Generation to miejsce przechowywania plików klas. Są one wynikiem skompilowanych klas i stron JSP. Jeśli to miejsce jest pełne, uruchamia pełne odśmiecanie. Jeśli funkcja pełnego odśmiecania nie może wyczyścić starych niereferencyjnych klas i nie ma już miejsca na rozszerzenie stałej przestrzeni, generowany jest błąd braku pamięci (OOME) i JVM ulega awarii.

kamienie333
źródło
48

W Javie 8 ten parametr jest powszechnie używany do drukowania komunikatu ostrzegawczego takiego jak ten:

64-bitowe ostrzeżenie maszyny wirtualnej serwera Java HotSpot ™: ignorowanie opcji MaxPermSize = 512m; wsparcie zostało usunięte w wersji 8.0

Powodem, dla którego pojawia się ten komunikat w Javie 8, jest to, że Permgen został zastąpiony przez Metaspace, aby rozwiązać niektóre z wad PermGen (jak mogłeś to zobaczyć, jedną z tych wad jest to, że miał ustalony rozmiar).

Do Twojej wiadomości: artykuł na temat Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

AndrewBourgeois
źródło
6
Zobacz także: Eliminacja PermGen w JDK 8 (stackoverflow).
będzie