Co właściwie oznacza PermGen?

122

Wiem, czym jest PermGen, do czego służy, dlaczego zawodzi, jak go zwiększyć itp.

Nie wiem, co właściwie oznacza PermGen. Stałe ... Coś ... Coś?

Czy ktoś wie, co właściwie oznacza PermGen?

SCdF
źródło
1
[Dobry opis] [1] od gościa, który dużo wie o wewnętrznych cechach GC. Nawiasem mówiąc, na jego blogu jest mnóstwo przydatnych informacji związanych z GC. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Dubrov

Odpowiedzi:

84

Trwała generacja. Szczegóły są oczywiście specyficzne dla implementacji.

Krótko mówiąc, zawiera obiekty Java powiązane z klasami i wewnętrznymi ciągami. W implementacji klienta firmy Sun z włączonym udostępnianiem classes.jsapamięć jest mapowana w celu utworzenia danych początkowych, z mniej więcej połową tylko do odczytu i połową kopiowaniem przy zapisie.

Obiekty Java, które są zaledwie stare, są przechowywane w generacji Tenured.

Tom Hawtin - haczyk
źródło
19
„W JDK 7 internowane ciągi znaków nie są już przydzielane w ramach trwałego generowania sterty Java”: oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi
30
A w JDK 8 w ogóle nie ma stałej generacji! Fajnie jest widzieć, jak ta odpowiedź ewoluowała na przestrzeni lat.
Brian Gordon
3
@BrianGordon ma rację. Więcej informacji na ten temat: stackoverflow.com/a/22509753/4557537
Fadi
59

PermGen jest używany przez JVM do przechowywania załadowanych klas. Możesz go zwiększyć za pomocą:

-XX:MaxPermSize=384m

jeśli używasz Sun JVM lub OpenJDK.

Więc jeśli otrzymasz OutOfMemoryException: PermGen, musisz albo powiększyć PermGen, albo możesz mieć problemy z ładowaniem klas.

bajafresh4life
źródło
6
Która odpowiedź była akceptowana w momencie, gdy publikowałeś ten komentarz? Aktualnie przyjęta odpowiedź ( ta , którą napisał „Tom Hawtin - tackline”) wydaje mi się dokładna. Czy zmiana komentarza może mieć sens, aby ludzie nie mieli zaufania do aktualnie zaakceptowanej odpowiedzi?
jbyler
8

Niezupełnie związane z pierwotnym pytaniem, ale może ktoś uzna je za przydatne. PermGen jest rzeczywiście obszarem w pamięci, w którym Java utrzymywała swoje klasy. Tak więc wielu z nas natknęło się na OOM w PermGen, gdyby było na przykład dużo zajęć.

Od wersji Java 8 obszar PermGen został zastąpiony obszarem MetaSpace, który jest bardziej wydajny i domyślnie nieograniczony (a ściślej - ograniczony ilością pamięci natywnej, w zależności od 32- lub 64-bitowej jvm i dostępności pamięci wirtualnej systemu operacyjnego). Można go jednak dostroić na kilka sposobów, na przykład określając maksymalny limit obszaru. Więcej przydatnych informacji znajdziesz w tym poście na blogu .

Alex K.
źródło
3

Jeśli dobrze pamiętam, gen oznacza generację, jak w pokoleniowym zbieraczu śmieci (który traktuje młodsze obiekty inaczej niż przedmioty w wieku średnim i „trwałe”). Zasada lokalności sugeruje, że nowo utworzone obiekty zostaną wymazane jako pierwsze.

Uri
źródło
1

Permgen oznacza Permanent Generation. Jest to jeden z obszarów pamięci JVM. Jest częścią Heap o stałym rozmiarze za pomocą flagi o nazwie MaxPermSize.

Skąd nazwa „PermGen”?

Ten permgen został nazwany we wczesnych dniach Java. Sieć Permgen przechowuje wszystkie metadane załadowanych klas. Problem polega jednak na tym, że po załadowaniu klasy pozostanie ona w JVM aż do wyłączenia JVM. Więc nazwa permgen jest taka. Ale później pojawiło się dynamiczne ładowanie klas, ale nazwa nie została zmieniona. Ale dzięki Java 8 rozwiązali również ten problem. Teraz permagen został przemianowany na MetaSpace z dynamicznym rozmiarem pamięci.

Sumanth Varada
źródło