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?


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


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


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 >>


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


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.