Jaka jest różnica między PermGen i Metaspace?

Do Javy 7 w pamięci JVM istniał obszar o nazwie PermGen , w którym JVM przechowywał swoje klasy. W Java 8 została usunięta i zastąpiona przez obszar 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ż rzucać, a parametr VM MaxPermSize jest ignorowany.

Author: Kao, 2014-11-25

3 answers

Główną różnicą z punktu widzenia użytkownika - co myślę, że poprzednia odpowiedź nie podkreśla wystarczająco-jest to, że Metaspace domyślnie automatycznie zwiększa swój rozmiar (do tego, co zapewnia system operacyjny), podczas gdy PermGen zawsze ma stały maksymalny rozmiar. Możesz ustawić stałe maksimum dla Metaspace z parametrami JVM, ale nie możesz automatycznie zwiększyć PermGen.

W dużej mierze jest to tylko zmiana nazwy. Kiedy wprowadzono PermGen, nie było Java EE ani dynamic Klasa (un)ładuje się, więc po załadowaniu klasy utknęła w pamięci aż do wyłączenia JVM - w ten sposób stała generacja . W dzisiejszych czasach klasy mogą być ładowane i rozładowywane w ciągu życia JVM, więc Metaspace ma większy sens dla obszaru, w którym przechowywane są metadane.

Obie zawierają instancje java.lang.Class i obie cierpią z powodu wycieków ClassLoader . Jedyną różnicą jest to, że przy domyślnych ustawieniach Metaspace trwa dłużej, dopóki nie zauważysz objawów (ponieważ automatycznie zwiększa się tak bardzo, jak to możliwe), tzn. po prostu odpychasz problem dalej, nie rozwiązując go. OTOH wyobrażam sobie, że efekt wyczerpania pamięci systemu operacyjnego może być poważniejszy niż tylko wyczerpanie JVM PermGen, więc nie jestem pewien, czy jest to duża poprawa.

Niezależnie od tego, czy używasz JVM z PermGen, czy z Metaspace, jeśli wykonujesz dynamiczne rozładowywanie klas, powinieneś podjąć środki przeciwko wyciekom classloadera, na przykład używając my ClassLoader Leak Prevention biblioteka .

 97
Author: Mattias Jiderhamn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-26 08:12:12

Bye, Bye Pergen, Hello Metaspace

PermGen został całkowicie usunięty.

Metaspace garbage collection - Garbage collection of the dead classes and classloaders jest wyzwalany, gdy użycie metadanych klasy osiągnie MaxMetaspaceSize.

Przechowywana przestrzeń Metadata nie jest już przylegająca do Java heap, metadata została przeniesiona do pamięci natywnej do obszaru znanego jako Metaspace.

W prostych słowach ,

Ponieważ Klasa metadane 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ć rozlewając się do przestrzeni wymiany.

Usunięcie PermGen nie oznacza, że problemy z wyciekiem klasowym zniknęły. Tak więc, tak, nadal będziesz musiał monitorować zużycie i odpowiednio planować, ponieważ wyciek skończyłby pochłaniać całą natywną pamięć.

Inne artykuły z analizą: Link1 , Link2 i to

 27
Author: Ankur Singhal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:30

W skrócie, Rozmiar Metaspace automatycznie zwiększa się w pamięci natywnej, gdy jest wymagany do załadowania metadanych klasy, jeśli nie jest ograniczony przez -XX:MaxMetaspaceSize

 7
Author: Chandrasekaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 10:58:28