Eliminacja PermGen w JDK 8

229

Zainstalowałem JDK 8 i próbuję uruchomić Eclipse. Otrzymuję następujący komunikat ostrzegawczy:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

Jakie są przyczyny zignorowania tej opcji maszyny wirtualnej?

Shamim Ahmmed
źródło
4
Informacje te mogą być przydatne
Andrew Martin,

Odpowiedzi:

358

Powody ignorowania tego argumentu to ciągłe generowanie zostało usunięte w HotSpot dla JDK8 z powodu następujących wad

  • Naprawiono rozmiar przy uruchomieniu - trudny do dostrojenia.
  • Wewnętrzne typy Hotspot były obiektami Java: Mógł się poruszać z pełnym GC, nieprzezroczysty, niezbyt typowy i trudny do debugowania, potrzebował meta-metadanych.
  • Uprość pełne kolekcje: specjalne iteratory dla metadanych dla każdego kolektora
  • Chcesz zwolnić przydział danych klasy jednocześnie, a nie podczas pauzy GC
  • Włącz przyszłe ulepszenia, które zostały ograniczone przez PermGen.

Przestrzeń Permanent Generation (PermGen) została całkowicie usunięta i jest jakby zastąpiona nową przestrzenią o nazwie Metaspace. Konsekwencją usunięcia PermGen jest to, że oczywiście argumenty PermSize i MaxPermSize JVM są ignorowane i nigdy nie otrzymasz błędu java.lang.OutOfMemoryError: PermGen.

Zalety MetaSpace

  • Skorzystaj z właściwości specyfikacji języka Java: Klasy i powiązane czasy życia metadanych pasują do modułu ładującego klasy
  • Na obszar przechowywania ładowarek - Metaspace
  • Tylko przydział liniowy
  • Brak indywidualnej rekultywacji (z wyjątkiem awarii RedefineClasses i klas ładowania)
  • Brak skanowania GC lub zagęszczenia
  • Brak relokacji dla obiektów metaspace

Tuning Metaspace

Maksymalny rozmiar metaspace można ustawić za pomocą flagi -XX: MaxMetaspaceSize, a wartość domyślna jest nieograniczona, co oznacza, że ​​limitem jest tylko pamięć systemowa. Flaga strojenia -XX: MetaspaceSize określa początkowy rozmiar metaspace. Jeśli nie określisz tej flagi, Metaspace zmieni rozmiar dynamicznie w zależności od zapotrzebowania aplikacji w czasie wykonywania.

Zmiana umożliwia inne optymalizacje i funkcje w przyszłości

  • Udostępnianie danych klasy aplikacji
  • Optymalizacje kolekcji młodych, rozładunek klasy G1
  • Zmniejszenie rozmiaru metadanych i wewnętrzne projekty śladu JVM

Poprawiono także wydajność GC. Więcej szczegółów

pardeep131085
źródło
29
Powinienem wspomnieć, że internowane ciągi były wcześniej przechowywane w przestrzeni PermGen, ale zostały przeniesione do głównej sterty Java w Javie 7.
gparyani
Dziękuję za szczegółowe wyjaśnienie.
Pradeep
3
Trochę łagodnego wprowadzenia dla ogółu odbiorców (mam na myśli przede wszystkim osoby spoza Javy, np. Koledzy deweloperzy mający do czynienia z JVM) nie zaszkodzi tej odpowiedzi.
ulidtko
117

Jest to jedna z nowych funkcji Java 8, części JDK Enhancement Propozycje 122 :

Usuń stałą generację z Hotspot JVM, a zatem musisz dostroić rozmiar stałej generacji.

Lista wszystkich JEP, które zostaną uwzględnione w Javie 8, znajduje się na stronie kamieni milowych JDK8 .

assylias
źródło
19

Przestrzeń Permanent Generation (PermGen) została całkowicie usunięta i jest niejako zastąpiona nową przestrzenią o nazwie Metaspace. Konsekwencją usunięcia PermGen jest to, że oczywiście argumenty JVM PermSize i MaxPermSize są ignorowane i nigdy nie pojawi się java.lang.OutOfMemoryErrorbłąd: PermGen. JVK JDK 8 HotSpot wykorzystuje teraz pamięć natywną do reprezentacji metadanych klasy i nazywa się Metaspace. Czytaj więcej >>

Dhrumil Shah
źródło
3
„HotSpot JVM używa teraz natywnej pamięci do reprezentowania metadanych klas. - i jakiej pamięci używała wcześniej HotSpot JVM? A czym jest wyjątek „rodzimej pamięci”?
Andrey M. Stepanov
16

Ponieważ przestrzeń PermGen została usunięta. Zarządzanie pamięcią nieco się zmieniło.

java-8-permgen-metaspace

Sebastian Redl
źródło
12

Przestrzeń PermGen jest zastępowana przez MetaSpace w Javie 8. Argumenty PermSize i MaxPermSize JVM są ignorowane i generowane jest ostrzeżenie, jeśli jest obecne podczas uruchamiania.

Większość przydziałów dla metadanych klasy jest teraz przydzielana z pamięci rodzimej. * Klasy użyte do opisu metadanych klasy zostały usunięte.

Główną różnicą między starym PermGen a nowym MetaSpace jest to, że nie musisz obowiązkowo definiować górnej granicy wykorzystania pamięci. Możesz zachować nieograniczony limit miejsca MetaSpace. Zatem, gdy zwiększa się użycie pamięci, nie pojawi się błąd OutOfMemoryError. Zamiast tego zarezerwowana pamięć natywna jest zwiększana, aby w pełni wypełnić zwiększone użycie pamięci.

Możesz zdefiniować maksymalny limit miejsca dla MetaSpace, a następnie wyrzuci OutOfMemoryError: Przestrzeń metadanych. Dlatego ważne jest ostrożne określenie tego limitu, abyśmy mogli uniknąć marnotrawstwa pamięci.

Shubham Pandey
źródło
9

Implementacja Oracle JVM dla Java 8 pozbyła się modelu PermGen i zastąpiła go Metaspace .

Chrylis - ostrożnie optymistyczne -
źródło