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, 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.
Perm Gen oznacza trwałe generowanie, które przechowuje informacje metadane o klasach.
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.
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.
JAVA8 wprowadził koncepcję zwaną generowaniem metaprzestrzeni, dlatego permgen nie jest już potrzebny, gdy używasz wersji jdk 1.8.
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.
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.
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.
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
Odpowiedzi:
Oznacza trwałe pokolenie :
źródło
Perm space
służy do przechowywania informacji o załadowanych klasach i kilku innych zaawansowanych funkcjach, takich jakString 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:MaxPermSize
pozbyć się tego błędu.źródło
Prosta (i nadmiernie uproszczona) odpowiedź: to tutaj jvm przechowuje własne dane księgowe, w przeciwieństwie do twoich danych.
źródło
Perm Gen oznacza trwałe generowanie, które przechowuje informacje metadane o klasach.
źródło
Przestrzeń permgen to obszar sterty, który zawiera wszystkie odblaskowe dane samej maszyny wirtualnej, takie jak obiekty klas i metod.
źródło
Zawiera takie rzeczy, jak definicje klas, pula ciągów, itp. Myślę, że można to nazwać metadanymi.
źródło
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.
źródło
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.
źródło
PermGen Space oznacza alokację pamięci do trwałego generowania. Wszystkie niezmienne obiekty Java należą do tej kategorii, podobnie jak te,
String
które są tworzone za pomocą literałów lubString.intern()
metod i do ładowania klas do pamięci. PermGen Space przyspiesza nasze wyszukiwanie równości ciągów.źródło
źródło