Maison >Java >JavaBase >La différence entre le tas et la pile Java

La différence entre le tas et la pile Java

angryTom
angryTomoriginal
2019-11-13 14:32:204419parcourir

La différence entre le tas et la pile Java

La différence entre tas et stack java

Avant de parler de tas et de stack, parlons de JVM (virtuel Division de la mémoire de la machine :

Les programmes Java doivent allouer de l'espace lorsqu'ils sont en cours d'exécution. Tout logiciel doit allouer de l'espace dans la mémoire lorsqu'il est en cours d'exécution. La JVM ouvre une zone de mémoire lors de son exécution et la divise plus soigneusement dans sa propre zone de mémoire lorsqu'elle démarre. Étant donné que chaque élément de mémoire de la machine virtuelle est traité de manière différente, il doit être géré séparément. .

La mémoire JVM est divisée en cinq parties :

1. Registre

2. >3. Zone de méthode ;

4. Mémoire de pile ;

5.

Concentrons-nous sur le tas et la pile :

Mémoire de pile : La mémoire de pile est d'abord une zone mémoire, qui stocke des variables locales, toutes définies dans des méthodes. Toutes sont des variables locales (Les variables globales en dehors de la méthode) Les variables locales sont également définies à l'intérieur de la boucle for. La fonction doit d'abord être chargée avant que les variables locales puissent être définies. Par conséquent, la méthode empile d'abord la pile, puis définit les variables. scope. , la variable sera libérée une fois qu'elle quittera la portée. La mémoire de la pile est mise à jour très rapidement car le cycle de vie des variables locales est très court.

Mémoire du tas : stocke les tableaux et les objets (en fait, les tableaux sont des objets). Tout ce qui est créé par new est dans le tas. Les entités (objets) sont stockées dans le tas. Les entités sont utilisées pour encapsuler les données, et elles en encapsulent plusieurs. (plusieurs attributs d'une entité). Si une donnée disparaît, l'entité n'a pas disparu et peut toujours être utilisée. Par conséquent, le tas ne sera libéré à aucun moment, mais la pile n'en stocke qu'un seul. variable. Une fois la variable libérée, elle disparaît. Bien que les entités du tas ne soient pas libérées, elles seront traitées comme des déchets. Java dispose d'un mécanisme de récupération de place pour les collecter de temps en temps.

Parlons du tas et de la pile en détail à travers une illustration :

Par exemple, l'instruction dans la fonction principale int [] arr=new int [3] ; en mémoire Comment est-il défini :

La fonction principale va d'abord dans la pile, définit une variable arr dans la pile, puis attribue une valeur à arr, mais le côté droit n'est pas une valeur spécifique, mais une entité. L'entité est créée dans le tas. Tout d'abord, un espace est ouvert dans le tas via le mot-clé new. Lorsque la mémoire stocke des données, cela est reflété par l'adresse est un binaire continu, puis une adresse mémoire est allouée. l’entité. Les tableaux ont un index. Une fois l'entité du tableau générée dans la mémoire du tas, chaque espace sera initialisé par défaut (c'est la caractéristique de la mémoire du tas. Les données non initialisées ne peuvent pas être utilisées, mais elles peuvent être utilisées dans le tas. Parce qu'elles ont un index. été initialisé mais pas sur la pile), différents types ont des valeurs initialisées différentes. Ainsi, les variables et les entités sont créées dans le tas et la pile :

La différence entre le tas et la pile Java

Alors, comment le tas et la pile sont-ils connectés

Nous venons de le faire ? a dit que nous allouons une adresse au tas, attribuons l'adresse du tas à arr et arr pointe vers le tableau via l'adresse. Ainsi, lorsque arr veut manipuler le tableau, il utilise l'adresse au lieu de lui attribuer directement des entités. Nous n’appelons plus cela un type de données de base, mais un type de données de référence. Il s'appelle arr et fait référence à l'entité dans la mémoire du tas. (Peut être compris comme un pointeur vers c ou c++, Java est issu du c++ et le c++ est très similaire, c++ optimisé)

La différence entre le tas et la pile JavaIf when int [] arr=null;

arr ne pointe vers rien, et la fonction de null est de déréférencer le pointeur du type de données.

Lorsqu'une entité n'est pas pointée par un type de données de référence, elle ne sera pas libérée dans la mémoire tas, mais sera traitée comme un déchet et automatiquement recyclée à des moments irréguliers, car Java dispose d'un mécanisme de recyclage automatique, (C++ ne le fait pas et oblige les programmeurs à recycler manuellement. S'il n'est pas recyclé, le tas grandira jusqu'à ce qu'il soit plein et la mémoire déborde, donc Java est meilleur que C++ dans la gestion de la mémoire). Le mécanisme de recyclage automatique (programme) surveille automatiquement s'il y a des déchets dans le tas, s'il y a des déchets, il effectuera automatiquement la collecte des déchets, mais il n'est pas certain du moment où ils seront collectés.

La différence entre le tas et la pile est donc évidente :

1. La mémoire de pile stocke les variables locales tandis que la mémoire de tas stocke les entités ; la mémoire est mise à jour plus rapidement que la mémoire tas car le cycle de vie des variables locales est très court ;

3. Les variables stockées dans la mémoire de pile seront libérées une fois leur cycle de vie terminé, tandis que les entités stockées dans la mémoire tas seront collectées. par le mécanisme de collecte des ordures de temps en temps.

Site Web php chinois, un grand nombre de

Tutoriels d'introduction à Java

gratuits, bienvenue pour apprendre en ligne !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn