web-dev-qa-db-fra.com

Élimination de PermGen dans JDK 8

J'ai installé JDK 8 et j'essaie de lancer 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 pour lesquelles cette option VM est ignorée?

212
Shamim Ahmmed

Les raisons pour lesquelles ces arguments ont été ignorés 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 hotspots internes étaient des objets Java: ils pouvaient se déplacer avec un CPG complet, opaques, pas fortement typés et difficiles à déboguer, ainsi que des méta-métadonnées nécessaires.
  • Simplifier les collections complètes: itérateurs spéciaux pour les métadonnées pour chaque collectionneur
  • Veut désallouer les données de classe simultanément et non pendant la pause du GC
  • Activer 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. La suppression de PermGen a évidemment pour conséquence que les arguments de la JVM PermSize et MaxPermSize sont ignorés et vous ne jamais obtenir une erreur Java.lang.OutOfMemoryError: PermGen.

Avantages de MetaSpace

  • Tirez parti de la propriété de spécification de langage Java: les classes et les durées de vie des métadonnées associées correspondent aux
  • Zone de stockage par chargeur - Metaspace
  • Allocation linéaire seulement
  • Pas de réclamation individuelle (sauf RedefineClasses et échec de chargement de classe)
  • Pas d'analyse ou de compactage GC
  • Pas de déplacement pour les objets de métaspace

Réglage de métaspace

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

Change active d'autres optimisations et fonctionnalités dans le futur

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

Il y a également une amélioration de la performance GC. Plus de détail

335
pardeep131085

C’est l’une des nouvelles fonctionnalités de Java 8, composant de Propositions d’amélioration JDK 122 :

Supprimez la génération permanente de la machine virtuelle Hotspot et par conséquent la nécessité d'ajuster la taille de la génération permanente.

La liste de tous les PEC qui seront inclus dans Java 8 est disponible à la page page Jalons JDK8 .

113
assylias

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 évidemment le fait que les arguments PermSize et MaxPermSize JVM sont ignorés et vous n'obtiendrez jamais un Java.lang.OutOfMemoryError: Erreur PermGen. La machine virtuelle Java JDK 8 HotSpot utilise maintenant la mémoire native pour la représentation des métadonnées de classe et s'appelle Metaspace. En savoir plus >>

18
Dhrumil Shah

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

http://Java.dzone.com/articles/Java-8-permgen-metaspace

15
Sebastian Redl

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 maintenant allouées en dehors 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 la limite supérieure d’utilisation de la mémoire. Vous pouvez garder la limite d'espace MetaSpace non limitée. Ainsi, lorsque l'utilisation de la mémoire augmente, vous n'obtiendrez pas l'erreur OutOfMemoryError. Au lieu de cela, la mémoire native réservée est augmentée pour remplir pleinement l'utilisation accrue de la mémoire.

Vous pouvez définir la limite maximale d’espace pour MetaSpace, puis l’espace OutOfMemoryError: Metadata sera lancé. Il est donc important de définir cette limite avec précaution afin d'éviter les pertes de mémoire.

11
Shubham Pandey

L'implémentation JVM d'Oracle pour Java 8 a supprimé le modèle PermGen et l'a remplacé par Metaspace .

8
chrylis