web-dev-qa-db-fra.com

Comment le pool de mémoire Java est-il divisé?

Je surveille actuellement une application Java avec jconsole. L'onglet mémoire vous permet de choisir entre:

Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”

Quelle est la différence entre eux ?

211
Dani Cricco

Mémoire de tas

La mémoire de tas est la zone de données d'exécution à partir de laquelle Java VM alloue de la mémoire pour toutes les instances de classe et les matrices. Le tas peut être de taille fixe ou variable. Le ramasse-miettes est un système de gestion automatique de la mémoire qui récupère la mémoire de tas pour les objets.

  • Eden Space : pool à partir duquel la mémoire est initialement allouée pour la plupart des objets.

  • Espace de survivant : pool contenant des objets ayant survécu à la récupération de place de l'espace Eden.

  • Génération permanente ou Ancienne génération : le pool contenant des objets qui existent depuis un peu de temps dans l'espace de survivant.

Mémoire non-tas

La mémoire non-tas comprend une zone de méthode partagée par tous les threads et la mémoire requise pour le traitement interne ou l'optimisation de la machine virtuelle Java. Il stocke des structures par classe, telles qu'un pool de constantes à l'exécution, des données de champ et de méthode, ainsi que le code des méthodes et des constructeurs. La zone de méthode fait logiquement partie du segment de mémoire mais, en fonction de l'implémentation, un Java VM ne peut ni le récupérer, ni le compacter. Comme la mémoire de tas, la zone de méthode peut être de taille fixe ou variable. La mémoire de la zone de méthode n'a pas besoin d'être contiguë.

  • Génération permanente : pool contenant toutes les données de réflexion de la machine virtuelle, telles que des objets de classe et de méthode. Avec les machines virtuelles Java utilisant le partage de données de classe, cette génération est divisée en zones de lecture seule et en lecture-écriture.

  • Cache de code : le HotSpot Java VM comprend également un cache de code contenant la mémoire utilisée pour la compilation. et stockage de code natif.

Voici de la documentation sur l'utilisation de Jconsole .

313
dfa

Le nouveau mot-clé alloue de la mémoire sur le segment Java. Le tas est le principal pool de mémoire, accessible à l'ensemble de l'application. Si la mémoire disponible pour cet objet est insuffisante, la machine virtuelle Java tente de récupérer une partie de la mémoire du segment de mémoire avec un garbage collection. S'il ne parvient toujours pas à obtenir suffisamment de mémoire, une erreur OutOfMemoryError est générée et la machine virtuelle Java se ferme.

Le tas est divisé en plusieurs sections différentes, appelées générations. Au fur et à mesure que les objets survivent à plus de collectes de déchets, ils sont promus en générations différentes. Les générations plus âgées ne sont pas ramassées aussi souvent. Comme ces objets ont déjà une longue vie, ils sont moins susceptibles d'être ramassés.

Lorsque les objets sont construits pour la première fois, ils sont alloués dans l'espace Eden. S'ils survivent à un ramassage des ordures, ils sont promus au Survivor Space et, s'ils y vivent assez longtemps, ils sont affectés à la génération permanente. Cette génération est beaucoup moins fréquemment collectée.

Il existe également une quatrième génération, appelée la génération permanente, ou PermGen. Les objets qui résident ici ne peuvent pas être récupérés et contiennent généralement un état immuable nécessaire à l'exécution de la machine virtuelle, tel que les définitions de classe et le pool constant de chaînes. Notez que l’espace PermGen doit être supprimé de Java 8 et sera remplacé par un nouvel espace appelé Metaspace, qui sera conservé dans la mémoire native. référence: : http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

enter image description hereenter image description here

60
Pythoner

Avec Java8, la région non-heap ne contient plus PermGen, mais Metaspace, qui constitue un changement majeur pour Java8, censé se débarrasser des erreurs de mémoire insuffisante avec Java, car la taille de métaspace peut être augmentée en fonction de l'espace requis par JVM pour les données de classe.

34
user2767149

La mémoire heap Java fait partie de la mémoire allouée à la machine virtuelle Java par le système d'exploitation.

Les objets résident dans une zone appelée le tas. Le segment de mémoire est créé au démarrage de la machine virtuelle et peut augmenter ou diminuer en taille pendant l'exécution de l'application. Lorsque le tas est plein, les ordures sont collectées.

enter image description here

Vous pouvez trouver plus de détails sur l'espace Eden, l'espace du survivant, l'espace occupé et la génération permanente dans la question SE ci-dessous:

génération jeune, titulaire et permanente

PermGen a été remplacé par Metaspace depuis la version Java 8.

En ce qui concerne vos questions:

  1. Eden Space, Survivor Space, Tenured Space font partie de la mémoire de tas
  2. Le métaspace et le cache de code font partie de la mémoire non-tas.

Codecache: La machine virtuelle Java (JVM) génère du code natif et le stocke dans une zone de mémoire appelée le codecache. La machine virtuelle Java génère du code natif pour diverses raisons, notamment pour la boucle d'interprétation générée dynamiquement, les tronçons Java JNI (Native Interface) et les méthodes Java compilées en code natif par le compilateur juste à temps (JIT). JIT est de loin le plus gros utilisateur du codecache.

19
Ravindra babu