Główna różnica z punktu widzenia użytkownika - co moim zdaniem poprzednia odpowiedź nie przecenić - jest to, że Metaspace domyślnie wzrasta auto jego rozmiar (aż do podstawowego systemu operacyjnego), podczas gdy PermGen ma zawsze ustalony maksymalny rozmiar. Możesz ustawić stałe maksimum dla Metaspace z parametrami JVM, ale nie możesz automatycznie zwiększyć PermGen.
W dużym stopniu jest to tylko zmiana nazwy. Wracając, gdy wprowadzono PermGen, nie było ładowania Java EE lub dynamicznego (un), więc po załadowaniu klasy było zablokowane w pamięci, aż JVM się wyłączy - czyli Permanentna Generacja. Obecnie klasy mogą być ładowane i rozładowywane w czasie trwania JVM, więc Metaspace ma więcej sensu w obszarze, w którym przechowywane są metadane.
Oba zawierają instancje java.lang.Class
i oba z nich cierpią na ClassLoader leaks. Jedyną różnicą jest to, że z domyślnymi ustawieniami Metaspace, trwa to dłużej, dopóki nie zauważysz symptomów (ponieważ auto zwiększa się tak bardzo, jak to tylko możliwe), tzn. Po prostu odsuwasz 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 Permgenu JVM, więc nie jestem pewien, czy jest to znaczna poprawa.
Niezależnie od tego, czy używasz JVM z PermGenem czy z Metaspace, jeśli robisz dynamiczne rozładowywanie klas, powinieneś podjąć kroki przeciw wyciekom klasyloadera, na przykład używając mojego ClassLoader Leak Prevention library.
pierwszy wynik google: http://www.infoq.com/articles/Java-PERMGEN-Removed – the8472
@ the8472 Tak, ale to (i wiele innych) wyników google opisuje tylko mechanizm Metaspace, nie wspominając nic o dokładnych różnicach między tym a PermGenem. – Kao