Aż do Java 7 istniał obszar w pamięci JVM o nazwie PermGen , w którym JVM zachowywał swoje klasy. W Javie 8 został usunięty i zastąpiony obszarem o nazwie Metaspace .
Jakie są najważniejsze różnice między PermGen i Metaspace?
Jedyną różnicą, jaką znam, jest to, że java.lang.OutOfMemoryError: PermGen space
nie można już wyrzucać, a parametr VM MaxPermSize
jest ignorowany.
Odpowiedzi:
Główna różnica z punktu widzenia użytkownika - co moim zdaniem poprzednia odpowiedź nie podkreśla wystarczająco - polega na tym, że Metaspace domyślnie automatycznie zwiększa swój rozmiar (do tego, co zapewnia podstawowy system operacyjny), podczas gdy PermGen zawsze ma ustalony maksymalny rozmiar. Możesz ustawić stałe maksimum dla Metaspace z parametrami JVM, ale nie możesz ustawić automatycznego zwiększania PermGen.
W dużej mierze to po prostu zmiana nazwy. Kiedy wprowadzono PermGen, nie było wczytywania (od) Java EE ani klas dynamicznych, więc po załadowaniu klasy utknęła w pamięci do czasu wyłączenia maszyny JVM - stąd Trwałe Generowanie. Obecnie klasy mogą być ładowane i zwalniane w trakcie życia maszyny JVM, więc Metaspace ma większy sens w obszarze, w którym przechowywane są metadane.
Oba zawierają
java.lang.Class
instancje i oba cierpią z powodu wycieków ClassLoader . Jedyną różnicą jest to, że przy domyślnych ustawieniach Metaspace trwa to dłużej, zanim zauważysz objawy (ponieważ automatycznie zwiększa się tak bardzo, jak to możliwe), tj. Po prostu odsuwasz problem dalej bez rozwiązywania go. OTOH Wyobrażam sobie, że efekt wyczerpania pamięci systemu operacyjnego może być poważniejszy niż zwykły brak JVM PermGen, więc nie jestem pewien, czy jest to znaczna poprawa.Niezależnie od tego, czy używasz maszyny JVM z PermGen, czy z Metaspace, jeśli wykonujesz dynamiczne wyładowywanie klas, powinieneś podjąć środki zapobiegające wyciekom klas, na przykład używając mojej biblioteki ClassLoader Leak Prevention .
źródło
Do widzenia, do widzenia PermGen, Hello Metaspace
PermGen został całkowicie usunięty.
Wyrzucanie elementów bezużytecznych w metaspace - Wyrzucanie elementów bezużytecznych martwych klas i modułów ładujących jest wyzwalane, gdy użycie metadanych klasy osiągnie
MaxMetaspaceSize
.Przestrzeń, która
Metadata
była przetrzymywana, nie jest już ciągła doJava heap
,metadata
teraz została przeniesiona do pamięci natywnej do obszaru znanego jakoMetaspace
.W prostych słowach ,
Ponieważ metadane klasy są przydzielane z pamięci natywnej, maksymalna dostępna przestrzeń to całkowita dostępna pamięć systemowa. W ten sposób nie będziesz już napotykać
OOM errors
i możesz skończyć wylać się na przestrzeń wymiany.Usunięcie
PermGen
nie oznacza, że zniknęły problemy z wyciekiem klas. Więc tak, nadal będziesz musiał monitorować swoje zużycie i odpowiednio planować, ponieważ wyciek skończyłby się zużyciem całej pamięci natywnej.Kilka innych artykułów z analizą: Link1 , Link2 i this
źródło
Krótko mówiąc, rozmiar Metaspace automatycznie zwiększa pamięć natywną zgodnie z wymaganiami w celu załadowania metadanych klasy, jeśli nie jest to ograniczone
-XX:MaxMetaspaceSize
źródło