Quelle est l’utilisation de MetaSpace dans Java 8?

Je sais qu’ils ont remplacé PermGen par MetaSpace en Java 8. Mais j’ai peu de questions:

  1. MetaSpace est-il par défaut collecté par GC?
  2. Même le PermGen est collecté par GC en ajoutant les arguments comme -XX:+CMSClassUnloadingEnabled , alors qu’est-ce qui rend MetaSpace meilleur que PermGen?
  3. MetaSpace est basé sur la mémoire native, donc il garde les objects Java sur les disques plutôt que sur la VM?
  4. Même MetaSpace peut manquer de mémoire? Si oui, j’obtiendrai une OutOfMemoryException .
  5. Par défaut, le MetaSpace peut se développer en augmentant la mémoire?

Merci d’avance

MetaSpace est-il par défaut collecté par GC?

Oui, le GC fonctionnera sur le méta-espace quand il sera plein, cela augmenterait également de manière dynamic (compte tenu de ses possibilités) la mémoire allouée aux métadonnées.

Même le PermGen est collecté par GC en ajoutant les arguments comme -XX: + CMSClassUnloadingEnabled, alors qu’est-ce qui rend MetaSpace meilleur que PermGen?

L’amélioration s’explique par l’expansion dynamic du métaspace, ce que le permgen n’était pas capable de faire.

MetaSpace est basé sur la mémoire native, donc il garde les objects Java sur les disques plutôt que sur la VM?

Basé sur la description de metaspace, il utilise uniquement la mémoire native (pas de pagination).

Basé sur les recherches de Pierre-Hugues Charbonneau ( lien ici ), il est clair que l’introduction de metaspace ne résout pas nécessairement le problème de MOO, c’est plutôt un pansement du problème, il tente de redimensionner dynamicment la mémoire du méta-espace pour nombre de classes qui sont chargées avec un effet secondaire possible de croissance incontrôlable (tant que la mémoire native le permet).

Nous pouvons obtenir la fameuse erreur de MOO en définissant l’argument MaxMetaspaceSize sur JVM et en exécutant le programme fourni.

merci beaucoup à Pierre – Hugues Charbonneau.

En réponse:

  1. Par défaut, la mémoire Metaspace est collectée si elle atteint le 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 chargeur de classe et de classe n’est plus nécessaire. Il vous suffit de régler ce paramètre si vous pensez que le ClassLoader présente une fuite de mémoire.

  2. MetaSpece utilise la mémoire native et l’organisation en mémoire avec des pointeurs fait que le GC est plus rapide que les anciennes mémoires PermGen.

  3. Non, cela signifie que la JVM utilise la mémoire comme programme C commun et n’utilise pas l’espace mémoire virtuel pour les objects Java. Cela semble que la mémoire est seulement limitée par la machine. Veillez à ce que la mémoire de la machine puisse être échangée sur le disque si nécessaire.

  4. 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 swap).

  1. MetaSpace est-il par défaut collecté par GC?

    La récupération de la mémoire des classes mortes et des chargeurs de classe est déclenchée une fois que l’utilisation des métadonnées de classe atteint «MaxMetaspaceSize» qui est par défaut "unlimited" . Une surveillance appropriée est donc nécessaire pour limiter le délai ou la fréquence de ce GC.

  2. Même le PermGen est collecté par GC en ajoutant les arguments comme -XX: + CMSClassUnloadingEnabled, alors qu’est-ce qui rend MetaSpace meilleur que PermGen?

    L’objective principal étant de supprimer le permgen, les utilisateurs n’ont pas à penser à le dimensionner correctement.

  3. MetaSpace est basé sur la mémoire native, donc il garde les objects Java sur les disques plutôt que sur la VM?

    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 laissé par le tas Java

  4. Même MetaSpace peut manquer de mémoire?

    Oui, il est limité par la quantité de mémoire de votre machine.