Pile et tas Java :didacticiel sur l'allocation de mémoire Java
Qu'est-ce que la mémoire de pile ?
Stack en Java est une section de mémoire qui contient des méthodes, des variables locales et des variables de référence. La mémoire de la pile est toujours référencée dans l'ordre Dernier-Entré-Premier-Sorti. Les variables locales sont créées dans la pile.
Qu'est-ce que la mémoire de tas ?
Heap est une section de mémoire qui contient des objets et peut également contenir des variables de référence. Les variables d'instance sont créées dans le tas
Allocation de mémoire en Java
Allocation de mémoire en Java est le processus dans lequel les sections de mémoire virtuelle sont mises de côté dans un programme pour stocker les variables et les instances de structures et de classes. Cependant, la mémoire n'est pas allouée à un objet lors de la déclaration mais seule une référence est créée. Pour l'allocation de mémoire de l'objet, la méthode new() est utilisée, de sorte que l'objet se voit toujours allouer de la mémoire sur le tas.
L'allocation de mémoire Java est divisée en sections suivantes :
- Tas
- Empiler
- Code
- Statique
Cette division de la mémoire est nécessaire à sa gestion efficace.
- Le code section contient votre bytecode .
- La pile section de mémoire contient des méthodes, des variables locales et des variables de référence.
- Le tas la section contient des Objets (peut également contenir des variables de référence).
- La statique la section contient des données/méthodes statiques .
Différence entre variable locale et variable d'instance
Variable d'instance est déclaré à l'intérieur d'une classe mais pas à l'intérieur d'une méthode
class Student{ int num; // num is instance variable public void showData{}
Variable locale sont déclarés à l'intérieur une méthode comprenant méthode arguments .
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
Différence entre pile et tas
Cliquez ici si la vidéo n'est pas accessible
Prenons un exemple pour mieux comprendre cela.
Considérez que votre méthode principale appelant la méthode m1
public void m1{ int x=20 }
Dans la pile java, un cadre sera créé à partir de la méthode m1.
La variable X dans m1 sera également créée dans le cadre pour m1 dans la pile. (Voir l'image ci-dessous).
La méthode m1 appelle la méthode m2. Dans la pile java, un nouveau cadre est créé pour m2 au-dessus du cadre m1.
Les variables b et c seront également créées dans un cadre m2 dans une pile.
public void m2(int b){ boolean c; }
La même méthode m2 appelle la méthode m3. Encore une fois, un cadre m3 est créé sur le dessus de la pile (voir image ci-dessous).
Supposons maintenant que notre méthode m3 crée un objet pour la classe "Account", qui a deux instances variables int p et int q.
Account { Int p; Int q; }
Voici le code de la méthode m3
public void m3(){ Account ref = new Account(); // more code }
L'instruction new Account() créera un objet de compte dans le tas.
La variable de référence « ref » sera créée dans une pile java.
L'opérateur d'affectation "=" fera une variable de référence pour pointer vers l'objet dans le tas.
Une fois que la méthode a terminé son exécution. Le flux de contrôle reviendra à la méthode appelante. Qui dans ce cas est la méthode m2.
La pile de la méthode m3 sera vidée.
Étant donné que la variable de référence ne pointera plus vers l'objet dans le tas, elle sera éligible pour la récupération de place.
Une fois que la méthode m2 a terminé son exécution. Il sera sorti de la pile, et toutes ses variables seront vidées et ne seront plus utilisables.
De même pour la méthode m1.
Finalement, le flux de contrôle reviendra au point de départ du programme. Ce qui est généralement la méthode "principale".
Et si Object a une référence comme variable d'instance ?
public static void main(String args[]) { A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
Dans ce cas, la variable de référence "enfant" sera créée dans le tas, qui à son tour pointera vers son objet, quelque chose comme le schéma ci-dessous.
Résumé :
- Lorsqu'une méthode est appelée, un cadre est créé en haut de la pile.
- Une fois qu'une méthode a terminé son exécution, le flux de contrôle revient à la méthode appelante et son cadre de pile correspondant est vidé.
- Les variables locales sont créées dans la pile
- Les variables d'instance sont créées dans le tas et font partie de l'objet auquel elles appartiennent.
- Les variables de référence sont créées dans la pile.
Java