Qu'est-ce que la mémoire de pile?
Stack in 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
L'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.
- La section de code contient votre bytecode .
- La section Stack de la mémoire contient des méthodes, des variables locales et des variables de référence.
- La section Heap contient des objets (peut également contenir des variables de référence).
- La section Statique contient des données / méthodes statiques .
Différence entre la variable locale et la variable d'instance
La variable d'instance est déclarée à l' intérieur d'une classe mais pas à l'intérieur d'une méthode
class Student{int num; // num is instance variablepublic void showData{}
Les variables locales sont déclarées dans une méthode comprenant des arguments de méthode .
public void sum(int a){int x = int a + 3;// a , x are local variables;}
Différence entre Stack et Heap
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 l'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 en tas.
La variable de référence "ref" sera créée dans une pile java.
L'opérateur d'affectation créera 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 retournera à la méthode appelante. Ce qui dans ce cas est la méthode m2.
La pile de la méthode m3 sera rincée.
Étant donné que la variable de référence ne pointera plus vers l'objet dans le tas, elle serait éligible pour le garbage collection.
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 pourront plus être utilisées.
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».
Que faire 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 diagramme 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 retourne à la méthode appelante et son frame 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.