Comment est divisé le pool de mémoire java?

je suis en train de surveiller 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 ?

193
demandé sur assylias 2009-08-11 23:07:13

4 réponses

mémoire de masse

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

  • Eden Space : la piscine à partir de laquelle la mémoire est initialement attribuée pour la plupart des objets.

  • Survivor Space : la piscine contenant des objets qui ont survécu à la collecte des ordures de L'Eden space.

  • génération titulaire or Old Gen : le pool contenant des objets qui existent depuis un certain temps dans l'espace des survivants.

Non-segment de mémoire

Non-heap la mémoire inclut une zone de méthode partagée entre tous les threads et la mémoire requise pour le traitement interne ou l'optimisation de la VM Java. Il stocke des structures par classe telles qu'un pool de constantes d'exécution, des données de champ et de méthode, et le code pour les méthodes et les constructeurs. La zone de méthode fait logiquement partie du tas mais, selon l'implémentation, une VM Java peut ne pas être collectée ou compacte. Comme la mémoire tas, la zone de la méthode peut être de taille fixe ou variable. La mémoire de la méthode il n'est pas nécessaire que la zone soit contiguë.

  • génération permanente : le pool contenant toutes les données réfléchissantes de la machine virtuelle elle-même, telles que les objets de classe et de méthode. Avec les Vm Java qui utilisent le partage de données de classe, cette génération est divisée en zones en lecture seule et en lecture-écriture.

  • Code Cache : la VM Java HotSpot inclut également une cache de code, contenant de la mémoire qui est utilisée pour la compilation et le stockage du code natif.

voici de la documentation sur L'utilisation de Jconsole .

295
répondu dfa 2018-05-03 17:13:56

Le mot clé new alloue de la mémoire sur le tas Java. Le tas est la piscine principale de mémoire,accessible à l'ensemble de la demande. S'il n'y a pas assez de mémoire disponible pour allouer cet objet, la JVM tente de récupérer un peu de mémoire du tas avec une collecte des ordures. S'il ne parvient pas encore à obtenir suffisamment de mémoire, un OutOfMemoryError est lancé, et le JVM sort.

le tas est divisé en plusieurs sections différentes, appelées générations. Comme des objets survivent plus de collections de déchets, ils sont promus dans différentes générations. Les vieilles générations ne sont pas ramassées aussi souvent. Comme ces objets ont déjà une durée de vie plus longue, 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 à une collecte de déchets, ils sont promus à L'espace des survivants, et s'ils y vivent assez longtemps, ils sont alloués à la tenure Génération. Cette génération de déchets est ramassée beaucoup moins fréquemment.

il y a aussi une quatrième génération, appelée la génération permanente, ou PermGen. Les objets qui résident ici ne sont pas éligibles pour être des déchets collectés, et contiennent généralement un État immuable nécessaire à L'exécution de la JVM, tels que les définitions de classe et le pool de constantes de chaîne. Notez que L'espace PermGen est prévu pour être retiré de Java 8, et sera remplacé par un nouvel espace appelé Metaspace, qui aura lieu en mémoire natif. référence: http://www.programcreek.com/2013/04/jvm-run-time-data-areas /

enter image description here enter image description here

49
répondu Pythoner 2016-05-08 17:19:31

avec Java8, la région non heap ne contient plus de PermGen mais Metaspace, qui est un changement majeur dans Java8, supposé se débarrasser des erreurs de mémoire avec java car la taille de metaspace peut être augmentée en fonction de l'espace requis par jvm pour les données de classe.

31
répondu user2767149 2014-06-18 05:30:03

Java Heap Memory fait partie de la mémoire attribuée à JVM par le système d'exploitation.

les objets résident dans une zone appelée le tas. Le tas est créé lorsque la JVM démarre et peut augmenter ou diminuer de taille pendant que l'application tourne. Lorsque le tas est plein, les ordures sont ramassées.

enter image description here

vous pouvez trouver plus de détails à propos de Eden De l'espace, Survivant de l'Espace, maître de l'Espace et de Génération Permanente en dessous SE question:

jeune , titulaire et permanente génération

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

en ce qui concerne vos requêtes:

  1. l'Eden de l'Espace, Survivant de l'Espace, maître de l'Espace font partie de la mémoire heap
  2. Metaspace et Cache de Code font partie de la non-mémoire du tas.

Codecache: la machine virtuelle Java (JVM) génère du code natif et le stocke dans une zone de mémoire appelée codecache. La JVM génère du code natif pour diverses raisons, y compris pour la boucle d'interpréteur générée dynamiquement, les stubs Java Native Interface (JNI), et pour les méthodes Java qui sont compilées en code natif par le compilateur juste-à-temps (JIT). Le JIT est de loin le plus grand utilisateur de codecache.

14
répondu Ravindra babu 2017-05-23 12:26:10