Wofür steht PermGen eigentlich?

122

Ich weiß, was PermGen ist, wofür es verwendet wird, warum es fehlschlägt, wie man es erhöht usw.

Was ich nicht weiß ist, wofür PermGen eigentlich steht. Permanent ... Gen ... etwas?

Weiß jemand, wofür PermGen eigentlich steht?

SCdF
quelle
1
[Gute Beschreibung] [1] von dem Typ, der viel über GC-Interna weiß. Übrigens gibt es in seinem Blog viele nützliche GC-bezogene Informationen. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Dubrov

Antworten:

84

Permanente Generation. Details sind natürlich implementierungsspezifisch.

Kurz gesagt, es enthält die Java-Objekte, die Klassen und internierten Zeichenfolgen zugeordnet sind. In der Client-Implementierung von Sun mit aktivierter Freigabe classes.jsawird der Speicher so zugeordnet, dass er die Anfangsdaten bildet, wobei etwa die Hälfte schreibgeschützt und die Hälfte schreibgeschützt ist.

Nur alte Java-Objekte werden in der Tenured Generation gespeichert.

Tom Hawtin - Tackline
quelle
19
"In JDK 7 werden internierte Zeichenfolgen in der permanenten Generierung des Java-Heaps nicht mehr zugewiesen": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi
30
Und in JDK 8 gibt es überhaupt keine permanente Generation! Es macht Spaß zu sehen, wie sich diese Antwort im Laufe der Jahre weiterentwickelt.
Brian Gordon
3
@BrianGordon ist korrekt .. Für weitere Informationen dazu: stackoverflow.com/a/22509753/4557537
Fadi
59

PermGen wird von der JVM verwendet, um geladene Klassen zu speichern. Sie können es erhöhen mit:

-XX:MaxPermSize=384m

Wenn Sie Sun JVM oder OpenJDK verwenden.

Wenn Sie also eine OutOfMemoryException: PermGen erhalten, müssen Sie entweder PermGen vergrößern, oder Sie haben möglicherweise Probleme mit dem Klassenladeprogramm.

bajafresh4life
quelle
6
Welche Antwort wurde zum Zeitpunkt der Veröffentlichung dieses Kommentars akzeptiert? Die aktuell akzeptierte Antwort ( diese von "Tom Hawtin - Tackline") sieht für mich korrekt aus. Könnte es sinnvoll sein, Ihren Kommentar so zu bearbeiten, dass die Leute der aktuell akzeptierten Antwort nicht misstrauen?
Jbyler
8

Nicht wirklich mit der ursprünglichen Frage verwandt, aber möglicherweise wird es jemand nützlich finden. PermGen ist in der Tat ein Bereich im Speicher, in dem Java seine Klassen beibehalten hat. So sind viele von uns in PermGen auf OOM gestoßen, wenn es zum Beispiel viele Klassen gab.

Seit Java 8 wurde der PermGen-Bereich durch den MetaSpace-Bereich ersetzt, der effizienter und standardmäßig unbegrenzt ist (oder genauer gesagt - begrenzt durch die Menge des nativen Speichers, abhängig von der Verfügbarkeit von 32- oder 64-Bit-JVM und dem virtuellen Speicher des Betriebssystems). Es ist jedoch möglich, es auf einige Arten abzustimmen, indem beispielsweise eine maximale Grenze für den Bereich angegeben wird. Weitere nützliche Informationen finden Sie in diesem Blogbeitrag .

Alex K.
quelle
3

Wenn ich mich richtig erinnere, steht das Gen für Generation, wie in einem Generationsmüllsammler (der jüngere Objekte anders behandelt als Mid-Life- und "permanente" Objekte). Das Prinzip der Lokalität legt nahe, dass kürzlich erstellte Objekte zuerst gelöscht werden.

Uri
quelle
1

Permgen steht für Permanent Generation. Es ist einer der JVM-Speicherbereiche. Es ist Teil von Heap mit fester Größe, indem ein Flag namens MaxPermSize verwendet wird.

Warum der Name "PermGen"?

Dieses Permgen wurde in den frühen Tagen von Java benannt. Das Permgen-Netz speichert alle Metadaten geladener Klassen. Das Problem ist jedoch, dass eine geladene Klasse bis zum Herunterfahren der JVM in der JVM verbleibt. Der Name Permgen ist also dafür entschieden. Später kam das dynamische Laden von Klassen ins Spiel, aber der Name wurde nicht geändert. Aber mit Java 8 haben sie auch dieses Problem behoben. Jetzt wurde Permagen in MetaSpace mit dynamischer Speichergröße umbenannt.

Sumanth Varada
quelle