Élimination de PermGen dans JDK 8

229

J'ai installé JDK 8 et j'essaie d'exécuter Eclipse. Je reçois le message d'avertissement suivant:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

Quelles sont les raisons d'ignorer cette option de machine virtuelle?

Shamim Ahmmed
la source
4
Vous pourriez trouver cette information: javaeesupportpatterns.blogspot.co.uk/2013/02/…
Andrew Martin

Réponses:

358

Les raisons d'ignorer ces arguments sont que la génération permanente a été supprimée dans HotSpot pour JDK8 en raison des inconvénients suivants

  • Taille fixe au démarrage - difficile à régler.
  • Les types de points d'accès internes étaient des objets Java: pouvaient se déplacer avec GC complet, opaques, pas fortement typés et difficiles à déboguer, méta-métadonnées nécessaires.
  • Simplifiez les collections complètes: itérateurs spéciaux pour les métadonnées pour chaque collecteur
  • Vous souhaitez désallouer les données de classe simultanément et non pendant la pause du GC
  • Activez les améliorations futures limitées par PermGen.

L'espace de génération permanente (PermGen) a été complètement supprimé et est en quelque sorte remplacé par un nouvel espace appelé Metaspace. Les conséquences de la suppression de PermGen sont qu'évidemment les arguments JVM PermSize et MaxPermSize sont ignorés et vous n'obtiendrez jamais d'erreur java.lang.OutOfMemoryError: PermGen.

Avantages de MetaSpace

  • Profitez de la propriété Java Language Specification: les classes et les durées de vie des métadonnées associées correspondent au chargeur de classe
  • Zone de stockage par chargeur - Metaspace
  • Allocation linéaire uniquement
  • Aucune remise en état individuelle (sauf pour RedefineClasses et échec de chargement de classe)
  • Aucun scan ou compactage GC
  • Aucune relocalisation pour les objets de métaspace

Réglage de Metaspace

La taille maximale de la métaspace peut être définie à l'aide de l'indicateur -XX: MaxMetaspaceSize, et la valeur par défaut est illimitée, ce qui signifie que seule la mémoire de votre système est la limite. L'indicateur de réglage -XX: MetaspaceSize définit la taille initiale de métaspace Si vous ne spécifiez pas cet indicateur, Metaspace se redimensionnera dynamiquement en fonction de la demande de l'application au moment de l'exécution.

Le changement permet d'autres optimisations et fonctionnalités à l'avenir

  • Partage de données de classe d'application
  • Optimisations de la jeune collection, déchargement de classe G1
  • Réductions de taille des métadonnées et projets d'empreinte JVM interne

Les performances du GC sont également améliorées. Plus de détails

pardeep131085
la source
29
Je dois mentionner que les chaînes internes ont été précédemment stockées dans l'espace PermGen, mais ont été déplacées vers le tas Java principal dans Java 7.
gparyani
Merci pour l'explication détaillée.
Pradeep
3
Une petite introduction douce pour le grand public (je veux dire principalement des gens qui ne sont pas Java, par exemple des collègues devops devant faire face à la JVM) ne nuirait pas à cette réponse.
ulidtko
117

C'est l'une des nouvelles fonctionnalités de Java 8, qui fait partie des propositions d'amélioration JDK 122 :

Supprimez la génération permanente de la JVM Hotspot et donc la nécessité de régler la taille de la génération permanente.

La liste de tous les JEP qui seront inclus dans Java 8 se trouve sur la page des jalons JDK8 .

assylias
la source
19

L'espace de génération permanente (PermGen) a été complètement supprimé et est en quelque sorte remplacé par un nouvel espace appelé Metaspace. Les conséquences de la suppression de PermGen sont qu'évidemment les arguments JVM PermSize et MaxPermSize sont ignorés et vous n'obtiendrez jamais d' java.lang.OutOfMemoryErrorerreur: PermGen. La JVM JDK 8 HotSpot utilise maintenant la mémoire native pour la représentation des métadonnées de classe et s'appelle Metaspace. Lire la suite >>

Dhrumil Shah
la source
3
'HotSpot JVM utilise maintenant la mémoire native pour la représentation des métadonnées de classe. - et quelle mémoire JVM HotSpot utilisée précédemment? Et qu'est-ce que la «mémoire native» exactement?
Andrey M. Stepanov
16

Parce que l'espace PermGen a été supprimé. La gestion de la mémoire a un peu changé.

java-8-permgen-metaspace

Sebastian Redl
la source
12

L'espace PermGen est remplacé par MetaSpace dans Java 8. Les arguments JVM PermSize et MaxPermSize sont ignorés et un avertissement est émis s'il est présent au démarrage.

La plupart des allocations pour les métadonnées de classe sont désormais allouées à partir de la mémoire native. * Les classes utilisées pour décrire les métadonnées de classe ont été supprimées.

La principale différence entre l'ancien PermGen et le nouveau MetaSpace est qu'il n'est pas obligatoire de définir une limite supérieure d'utilisation de la mémoire. Vous pouvez garder la limite d'espace MetaSpace illimitée. Ainsi, lorsque l'utilisation de la mémoire augmente, vous n'obtiendrez pas d'erreur OutOfMemoryError. Au lieu de cela, la mémoire native réservée est augmentée pour remplir complètement l'augmentation de l'utilisation de la mémoire.

Vous pouvez définir la limite maximale d'espace pour MetaSpace, puis il lancera OutOfMemoryError: Espace de métadonnées. Il est donc important de définir cette limite avec prudence, afin d'éviter le gaspillage de mémoire.

Shubham Pandey
la source
9

L'implémentation JVM d'Oracle pour Java 8 s'est débarrassée du modèle PermGen et l'a remplacé par Metaspace .

chrylis-prudemment optimiste-
la source