Gestion de la mémoire en Java-Metaspace / mémoire native


La mémoire native (Métaspace) pour une application java obtient-elle de l'espace à partir de la mémoire de tas ou il existe un ensemble de mémoire complètement différent qui lui est dédié?

Je pense qu'il utilise la mémoire qui est utilisée par le système d'exploitation pour gérer toutes leurs applications, mais pas claire.

Author: rajvineet, 2016-12-29

1 answers

Espace de tas Java

Java Heap space est utilisé par java runtime pour allouer de la mémoire aux objets et aux classes JRE. Chaque fois que nous créons un objet, il est toujours créé dans l'espace Tas. Garbage Collection s'exécute sur la mémoire du tas pour libérer la mémoire utilisée par les objets qui n'ont aucune référence. Tout objet créé dans l'espace tas a un accès global et peut être référencé à partir de n'importe où de l'application.

Mémoire de pile Java

La mémoire de pile Java est utilisée pour l'exécution d'un thread. Ils contiennent des valeurs spécifiques à la méthode qui sont de courte durée et des références à d'autres objets du tas qui sont référencés à partir de la méthode. La mémoire de pile est toujours référencée dans l'ordre LIFO (Last-In-First-Out). Chaque fois qu'une méthode est invoquée, un nouveau bloc est créé dans la mémoire de la pile pour que la méthode contienne des valeurs primitives locales et fasse référence à d'autres objets de la méthode. Dès que la méthode se termine, le bloc devient inutilisés et devient disponible pour la méthode suivante. Pile la taille de la mémoire est très inférieure à celle de la mémoire de tas.

Différence entre l'espace de tas Java et la mémoire de pile

  • La mémoire de tas est utilisée par toutes les parties de l'application alors que la mémoire de pile n'est utilisée que par un thread d'exécution.

  • Chaque fois qu'un objet est créé, il est toujours stocké dans l'espace Tas et la mémoire de pile contient la référence à celui-ci. La mémoire de pile contient uniquement des variables primitives locales et des variables de référence aux objets dans le tas espace.

  • Les objets stockés dans le tas sont globalement accessibles alors que la mémoire de la pile n'est pas accessible par d'autres threads.

  • La gestion de la mémoire dans la pile se fait de manière LIFO alors qu'elle est plus complexe dans la mémoire de tas car elle est utilisée globalement. La mémoire de tas est divisée en Jeune génération, Ancienne génération, etc., plus de détails sur Java Garbage Collection.

  • La mémoire de pile est de courte durée alors que la mémoire de tas vit du début jusqu'au la fin de l'exécution de l'application.

  • Nous pouvons utiliser l'option-Xms et-Xmx JVM pour définir la taille de démarrage et la taille maximale de la mémoire de tas. Nous pouvons utiliser-Xss pour définir la taille de la mémoire de la pile.

  • Lorsque la mémoire de la pile est pleine, Java runtime renvoie java.lang.StackOverFlowError alors que si la mémoire de tas est pleine, il renvoie java.lang.OutOfMemoryError: Java Heap Space erreur.

  • La taille de la mémoire de la pile est très inférieure à celle de la mémoire de tas. En raison de la simplicité dans l'allocation de mémoire (LIFO), la mémoire de pile est très rapide quand comparé à la mémoire de tas.

Référence:

C'est la base de la gestion de la mémoire Java, mais en parcourant le matériel de référence devrait vous donner une idée complète.

Modifier

Merci à @ rajvineet de souligner cet excellent article sur comment la JVM utilise native mémoire sous Windows et Linux . Spécialement la section, comment le runtime Java utilise la mémoire native décrit tout clairement.

 0
Author: Wasi Ahmad, 2016-12-29 06:55:49