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.
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 .
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ęć.
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
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