Java Stack and Heap : Tutoriel d'allocation de mémoire Java

Qu'est-ce que la mémoire de pile ?

La pile 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 pile est toujours référencée dans l'ordre Last-In-First-Out. Les variables locales sont créées dans la pile.

Qu’est-ce que la mémoire tas ?

Le tas 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 dans Java est le processus dans lequel les sections de mémoire virtuelle sont mises de côté dans un programme de stockage des variables et des 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 deuxwing sections :

  1. Heap
  2. Stack
  3. Code
  4. Statique

Cette division de la mémoire est nécessaire à sa gestion efficace.

  • Le code la section contient votre bytecode.
  • Le Stack la section de mémoire contient méthodes, variables locales et variables de référence.
  • Le Heap la section contient Objets (peut également contenir des variables de référence).
  • Le Statique la section contient Données/méthodes statiques.

Différence entre la variable locale et la 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 a 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 stack java, un frame sera créé à partir de la méthode m1.

Pile et tas Java

La variable X dans m1 sera également créée dans le cadre de m1 dans la pile. (Voir l'image ci-dessous).

Pile et tas Java

La méthode m1 appelle la méthode m2. Dans la pile Java, un nouveau frame est créé pour m2 au-dessus du frame m1.

Pile et tas Java

Pile et tas Java

Les variables b et c seront également créées dans un frame m2 dans une pile.

public void m2(int b){
boolean c;
}

Pile et tas Java

La même méthode m2 appelle la méthode m3. Encore une fois, un cadre m3 est créé en haut de la pile (voir image ci-dessous).

Pile et tas Java

Pile et tas Java

Supposons maintenant que notre méthode m3 crée un objet pour la classe « Compte », qui a deux variable d'instance 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.

Pile et tas Java

La variable de référence « ref » sera créée dans une pile java.

Pile et tas Java

L'opérateur d'affectation « = » créera une variable de référence pour pointer vers l'objet dans le tas.

Pile et tas Java

Une fois que la méthode a terminé son exécution. Le flux de contrôle reviendra à la méthode appelante. Ce qui dans ce cas est la méthode m2.

Pile et tas Java

La pile de la méthode m3 sera vidée.

Pile et tas Java

Étant donné que la variable de référence ne pointera plus vers l’objet dans le tas, elle serait éligible au garbage collection.

Pile et tas Java

Une fois la méthode m2 terminée son exécution. Il sera retiré de la pile et toutes ses variables seront vidées et ne seront plus disponibles.

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 avait 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.

Pile et tas Java

Résumé :

  • Lorsqu'une méthode est appelée, un cadre est créé en haut de la pile.
  • Une fois l'exécution d'une méthode terminée, 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.