Que fait -XX: MaxPermSize?

260

Plus précisément, pourquoi cela aiderait-il à résoudre un problème PermGen OutOfMemoryError?

Aussi, des points bonus pour une réponse qui m'indique la documentation sur les arguments JVM ...

Geoff
la source
6
oracle.com/technetwork/java/javase/tech/… Comment allez-vous me donner ces points bonus maintenant? :)
Denys Séguret
1
@PaulTomblin Je ne suis pas sûr que le type à l'article auquel vous créez un lien (le premier résultat de Google) ait une idée de ce dont il parle.
Denys Séguret
@dystroy Je pourrais vous envoyer un cookie? Ou vous pourriez simplement être satisfait d'une question à laquelle vous avez bien répondu;)
Geoff
5
Cela ne répond pas spécifiquement à la question mais si vous regardez la gestion de la mémoire JVM, les meilleurs articles que j'ai lus sont ceci et ce lien infoq
Abe

Réponses:

274

L'espace permanent est l'endroit où les classes, les méthodes, les chaînes internalisées et les objets similaires utilisés par la machine virtuelle sont stockés et jamais désalloués (d'où le nom).

Cet article Oracle présente succinctement le fonctionnement et le paramétrage du GC HotSpot et vous conseille d'augmenter cet espace si vous chargez de nombreuses classes (c'est généralement le cas pour les serveurs d'applications et certains IDE comme Eclipse):

La génération permanente n'a pas d'impact notable sur les performances du ramasse-miettes pour la plupart des applications. Cependant, certaines applications génèrent et chargent dynamiquement de nombreuses classes; par exemple, certaines implémentations de pages JavaServer Pages (JSP). Ces applications peuvent nécessiter une génération permanente plus importante pour contenir les classes supplémentaires. Si tel est le cas, la taille de génération permanente maximale peut être augmentée avec l'option de ligne de commande -XX: MaxPermSize =.

Notez que cette autre documentation Oracle répertorie les autres arguments HotSpot.

Mise à jour: à partir de Java 8, l'espace permgen et ce paramètre ont disparu. Le modèle de mémoire utilisé pour les classes et méthodes chargées est différent et n'est pas limité (avec les paramètres par défaut). Vous ne devriez plus voir cette erreur.

Denys Séguret
la source
93

-XX:PermSize -XX:MaxPermSize sont utilisés pour définir la taille de la génération permanente.

Génération permanente: La génération permanente est l'endroit où les fichiers de classe sont conservés. Ce sont le résultat de classes compilées et de pages JSP. Si cet espace est plein, il déclenche un garbage collection complet. Si la récupération de place complète ne peut pas nettoyer les anciennes classes non référencées et qu'il n'y a plus de place pour étendre l'espace permanent, une erreur de mémoire insuffisante (OOME) est générée et la machine virtuelle Java se bloque.

pierres333
la source
48

Dans Java 8, ce paramètre est couramment utilisé pour imprimer un message d'avertissement comme celui-ci:

Avertissement de VM de serveur 64 bits Java HotSpot (TM): ignorer l'option MaxPermSize = 512m; le support a été supprimé dans la version 8.0

La raison pour laquelle vous obtenez ce message dans Java 8 est que Permgen a été remplacé par Metaspace pour résoudre certains des inconvénients de PermGen (comme vous avez pu le constater par vous-même, l'un de ces inconvénients est qu'il avait une taille fixe).

FYI: un article sur Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

AndrewBourgeois
la source
6
Voir aussi: Élimination de PermGen dans JDK 8 (stackoverflow).
le