Je sais qu'ils ont remplacé PermGen par MetaSpace dans Java 8.). Mais j'ai quelques questions à poser:
-XX:+CMSClassUnloadingEnabled
, alors pourquoi MetaSpace est-il meilleur que PermGen?OutOfMemoryException
.Merci d'avance
MetaSpace est-il par défaut collecté par GC?
Oui, le GC fonctionnera sur le métaspace une fois rempli, il augmentera également de manière dynamique (compte tenu de ses autorisations) la mémoire allouée pour les métadonnées.
Même le PermGen est collecté par GC en ajoutant les arguments tels que -XX: + CMSClassUnloadingEnabled, alors qu'est-ce qui rend MetaSpace meilleur que PermGen?
L’amélioration réside dans l’expansion dynamique du méta-espace, ce que permgen n’a pas été en mesure de faire.
MetaSpace est basé sur la mémoire native, il conserve donc les objets Java sur les disques plutôt que sur la machine virtuelle?).
Basé sur la description du métaspace, il utilise uniquement la mémoire native (pas de pagination).
Selon les recherches de Pierre-Hugues Charbonneau ( lien ici ), il est clair que l’introduction du métaspace ne résout pas nécessairement le problème du MOO, c’est au mieux un pansement, il tente de dynamiser redimensionnez la mémoire du métaspace afin de prendre en charge le nombre croissant de classes qui sont chargées avec un effet secondaire de croissance incontrôlable (tant que la mémoire native le permet).
Nous pouvons obtenir la célèbre erreur de MOO en définissant l'argument MaxMetaspaceSize
sur JVM et en exécutant le programme exemple fourni.
merci beaucoup à Pierre - Hugues Charbonneau.
En réponse:
Par défaut, la mémoire Metaspace est collectée si elle atteint MaxMetaspaceSize. Ce paramètre est initialement illimité. La limite est la mémoire de votre machine. Mais la mémoire est automatiquement libérée lorsqu'un class et un chargeur de classes ne sont plus nécessaires. Vous devez uniquement ajuster ce paramètre si vous pensez que le ClassLoader présente une fuite de mémoire.
MetaSpece utilise la mémoire native et l'organisation en mémoire avec des pointeurs rend le GC plus rapide que la mémoire PermGen plus ancienne.
Non, cela signifie que la machine virtuelle Java utilise la mémoire comme un programme C commun et n'utilise pas l'espace de mémoire virtuelle pour les objets Java. Il semble que la mémoire ne soit limitée que par la machine. Faites attention que la mémoire de la machine peut être permutée sur le disque si nécessaire.
Si vous définissez le paramètre MaxMetaspaceSize, vous pouvez obtenir OutOfMemory et, si vous ne définissez pas ce paramètre, vous pouvez obtenir si le processus alloue toute la mémoire de la machine (y compris l'espace de permutation).
MetaSpace est-il par défaut collecté par GC?
La récupération de place des classes mortes et des chargeurs de classe est déclenchée une fois que l'utilisation des métadonnées de classe a atteint "MaxMetaspaceSize", qui est par défaut "unlimited"
_ donc une surveillance appropriée est nécessaire pour limiter le retard ou la fréquence d'un tel GC.
Même le PermGen est collecté par GC en ajoutant les arguments tels que -XX: + CMSClassUnloadingEnabled, alors pourquoi MetaSpace est-il meilleur que PermGen?
L’objectif principal est de supprimer permgen afin que les utilisateurs n’aient pas à penser à le dimensionner correctement.
MetaSpace est basé sur la mémoire native, il conserve donc les objets Java sur les disques plutôt que sur la machine virtuelle?).
Le disque n'est pas une mémoire native, mais un périphérique de stockage. La mémoire native, dans ce contexte est la zone, est la mémoire du processus restant du tas Java
Même MetaSpace peut manquer de mémoire?
Oui, il est limité par la quantité de mémoire de votre machine.