Co to jest perm space?

88

Ucząc się o profilowaniu pamięci w Javie, oprócz „sterty” wciąż widzę termin „przestrzeń perm”. Wiem, co to jest kupa - co to jest perm?

skiphoppy
źródło
13
Java 8 całkowicie usunęła tę koncepcję i przeniosła się do Metaspace
pramodc84,
2
Odnośnik dobrze wyjaśniony tutaj youtube.com/watch?v=PUUJ4rNpRhU
shareef

Odpowiedzi:

103

Oznacza trwałe pokolenie :

Trwałe generowanie jest wyjątkowe, ponieważ zawiera metadane opisujące klasy użytkowników (klasy, które nie są częścią języka Java). Przykładami takich metadanych są obiekty opisujące klasy i metody, które są przechowywane w Permanent Generation. Aplikacje z dużą bazą kodu mogą szybko zapełnić ten segment sterty, co spowoduje java.lang.OutOfMemoryError: PermGen bez względu na to, jak wysoki jest twój -Xmx i ile masz pamięci na maszynie.

Andrew Hare
źródło
Andrew, jestem po prostu ciekawy, jaki może być rozmiar PerGen?
gks
Ciekawe, czy permgen jest częścią pamięci sterty (jak stwierdzono w tej odpowiedzi), czy też jest poza stertą (jak stwierdzono w tej odpowiedzi - stackoverflow.com/a/31103100/3061686 ).
akki
25

Perm spacesłuży do przechowywania informacji o załadowanych klasach i kilku innych zaawansowanych funkcjach, takich jak String Pool(do wysoce zoptymalizowanego testowania równości ciągów), które zwykle są tworzone za pomocą String.intern()metod. Ponieważ Twoja aplikacja (liczba klas) będzie rosła, przestrzeń ta zostanie szybko zapełniona, ponieważ czyszczenie pamięci w tej przestrzeni nie jest zbyt skuteczne w wymaganym miejscu, szybko otrzymasz komunikat Out of Memory: perm gen space error. Po tym czasie żadna aplikacja nie będzie działać skutecznie na tym komputerze, nawet po ogromnym, pustym JVM.

Przed uruchomieniem aplikacji powinieneś java -XX:MaxPermSizepozbyć się tego błędu.

DKSRathore
źródło
Pula stringów zostaje przeniesiona do miejsca na sterty od czasu Java 7.
Caffeine Coder
20

Prosta (i nadmiernie uproszczona) odpowiedź: to tutaj jvm przechowuje własne dane księgowe, w przeciwieństwie do twoich danych.

Matt
źródło
17

Perm Gen oznacza trwałe generowanie, które przechowuje informacje metadane o klasach.

  1. Załóżmy, że jeśli utworzysz nazwę klasy A, jej zmienna instancji będzie przechowywana w pamięci sterty, a klasa A wraz ze statycznymi programami ładującymi klasy będzie przechowywana na stałe.
  2. Odśmiecaczom będzie trudno wyczyścić lub zwolnić miejsce w pamięci stałej generacji. Dlatego zawsze zaleca się utrzymywanie ustawień pamięci permgen na zalecanym limicie.
  3. JAVA8 wprowadził koncepcję zwaną generowaniem metaprzestrzeni, dlatego permgen nie jest już potrzebny, gdy używasz wersji jdk 1.8.
Praveen Kumar KS
źródło
5

Przestrzeń permgen to obszar sterty, który zawiera wszystkie odblaskowe dane samej maszyny wirtualnej, takie jak obiekty klas i metod.

Jesse
źródło
3

Zawiera takie rzeczy, jak definicje klas, pula ciągów, itp. Myślę, że można to nazwać metadanymi.

Nacięcie
źródło
3

Przestrzeń permgen jest zawsze nazywana obszarem metody. Kiedy podsystem classloader załaduje plik klasy (kod bajtowy) do obszaru metody (permGen). Zawiera wszystkie metadane klasy, np .: w pełni kwalifikowaną nazwę Twojej klasy, w pełni kwalifikowaną nazwę bezpośredniej klasy nadrzędnej, informacje o zmiennej, informacje o konstruktorze, informacje o stałej puli itp.

Amruta
źródło
2

To, co istnieje w PremGen: Class Area, wchodzi w zakres PremGen. Pola statyczne są również rozwijane w czasie ładowania klasy, więc istnieją również w PremGen. Tutaj przechowywany jest obszar puli stałej zawierający wszystkie niezmienne pola, które są zebrane jak łańcuch. Oprócz tego znajdują się również dane klas ładowane przez programy ładujące klasy, tablice obiektów, wewnętrzne obiekty używane przez jvm.

hi.nitish
źródło
1

PermGen Space oznacza alokację pamięci do trwałego generowania. Wszystkie niezmienne obiekty Java należą do tej kategorii, podobnie jak te, Stringktóre są tworzone za pomocą literałów lub String.intern()metod i do ładowania klas do pamięci. PermGen Space przyspiesza nasze wyszukiwanie równości ciągów.

Spark-Beginner
źródło
1
  • JVM ma wewnętrzną reprezentację obiektów Java, a te wewnętrzne reprezentacje są przechowywane na stercie (w młodym pokoleniu lub w pokoleniu najemnym).
  • JVM ma również wewnętrzną reprezentację klas Java, które są przechowywane w trwałej generacji

wprowadź opis obrazu tutaj

Roopesh Payyanath
źródło