Was macht -XX: MaxPermSize?

259

Warum sollte es speziell helfen, ein PermGen OutOfMemoryError-Problem zu beheben?

Außerdem Bonuspunkte für eine Antwort, die mich auf die Dokumentation zu JVM-Argumenten verweist ...

Geoff
quelle
6
oracle.com/technetwork/java/javase/tech/… Wie geben Sie mir diese Bonuspunkte jetzt? :)
Denys Séguret
1
@PaulTomblin Ich bin mir nicht sicher, ob der Typ, auf den Sie verlinken (das erste Ergebnis von Google), eine Vorstellung davon hat, wovon er spricht.
Denys Séguret
@dystroy Ich könnte dir einen Cookie schicken? Oder Sie könnten einfach nur eine Frage beantworten, die gut beantwortet ist;)
Geoff
5
Dies beantwortet die Frage nicht speziell, aber wenn Sie sich die JVM-Speicherverwaltung ansehen , sind die besten Artikel, die ich darüber gelesen habe, dieser und dieser Info-Link
Abe

Antworten:

273

Im permanenten Bereich werden die von der VM verwendeten Klassen, Methoden, internalisierten Zeichenfolgen und ähnlichen Objekte gespeichert und niemals freigegeben (daher der Name).

Dieser Oracle-Artikel beschreibt kurz und bündig die Funktionsweise und Parametrisierung des HotSpot GC und empfiehlt Ihnen, diesen Speicherplatz zu erweitern, wenn Sie viele Klassen laden (dies ist normalerweise bei Anwendungsservern und einigen IDE wie Eclipse der Fall):

Die permanente Generierung hat für die meisten Anwendungen keinen spürbaren Einfluss auf die Leistung des Garbage Collectors. Einige Anwendungen generieren und laden jedoch dynamisch viele Klassen. Zum Beispiel einige Implementierungen von JavaServer Pages (JSP) -Seiten. Diese Anwendungen benötigen möglicherweise eine größere permanente Generation, um die zusätzlichen Klassen aufzunehmen. In diesem Fall kann die maximale permanente Generierungsgröße mit der Befehlszeilenoption -XX: MaxPermSize = erhöht werden.

Beachten Sie, dass in dieser anderen Oracle-Dokumentation die anderen HotSpot-Argumente aufgeführt sind.

Update: Ab Java 8 sind sowohl der Permgen-Speicherplatz als auch diese Einstellung weg. Das für geladene Klassen und Methoden verwendete Speichermodell ist unterschiedlich und nicht eingeschränkt (mit Standardeinstellungen). Sie sollten diesen Fehler nicht mehr sehen.

Denys Séguret
quelle
93

-XX:PermSize -XX:MaxPermSize werden verwendet, um die Größe für die permanente Generierung festzulegen.

Permanente Generierung: In der permanenten Generierung werden Klassendateien gespeichert. Dies ist das Ergebnis kompilierter Klassen und JSP-Seiten. Wenn dieser Speicherplatz voll ist, wird eine vollständige Speicherbereinigung ausgelöst. Wenn die Full Garbage Collection alte nicht referenzierte Klassen nicht bereinigen kann und kein Platz mehr zum Erweitern des permanenten Speicherplatzes vorhanden ist, wird ein Out-of-Memory-Fehler (OOME) ausgelöst und die JVM stürzt ab.

Steine333
quelle
48

In Java 8 wird dieser Parameter häufig zum Drucken einer Warnmeldung wie der folgenden verwendet:

Java HotSpot (TM) 64-Bit-Server-VM-Warnung: Option MaxPermSize = 512m wird ignoriert; Unterstützung wurde in 8.0 entfernt

Der Grund, warum Sie diese Nachricht in Java 8 erhalten, ist, dass Permgen durch Metaspace ersetzt wurde, um einige der Nachteile von PermGen zu beheben (wie Sie selbst sehen konnten, besteht einer dieser Nachteile darin, dass es eine feste Größe hatte).

Zu Ihrer Information: Ein Artikel über Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

Andrew Bourgeois
quelle
6
Siehe auch: PermGen-Eliminierung in JDK 8 (Stackoverflow).
wird