Java >> Tutoriel Java >  >> Tag >> Stack

Quelles sont les différences entre Heap et Stack Memory en Java ?

1) Pile de mémoire en Java

  • Pour la mémoire de pile , JVM crée une pile d'exécution distincte pour chaque thread individuel au moment de l'instanciation (création) du thread.
  • Non "nouveau" le mot-clé est requis pour la mémoire de la pile .
  • Chaque appel de méthode effectué par ce thread et cette méthode sera stocké dans la pile d'exécution correspondante (c'est-à-dire que le nouveau thread créé est chargé d'appeler sa méthode et l'entrée de méthode sera stockée dans la pile d'exécution souhaitée au moment de l'instanciation de ce thread) .

Exemple :

class ChildThread extends Thread{

	public void run(){
		System.out.println("I am in child thread");
	}

}

class MainThread{
	public static void main(String[] args){
		ChildThread ct = new ChildThread();
		ct.start(); 

		public static void m1(){
			System.out.println("I am in main thread");
		}
	}
}

Dans l'exemple ci-dessus, nous avons deux threads :

  1. Fil principal
  2. Fil de discussion enfant
Pile d'exécution pour enfant Pile d'exécution pour Main
exécuter() m1() méthode
main() méthode

  • Après l'exécution de la méthode, l'entrée de méthode correspondante de la pile sera supprimée.
  • Après avoir exécuté tous les appels de méthode, la pile deviendra vide et cette pile vide sera détruite par la JVM avant de terminer le thread.
  • La mémoire de la pile n'est pas globale (c'est-à-dire qu'une variable ou une méthode de pile ne peut pas être utilisée dans une autre pile).
  • Chaque entrée de la pile est appelée cadre de pile ou enregistrements d'activation.
  • JVM crée une pile d'exécution distincte pour chaque thread (c'est-à-dire que les données stockées dans la pile ne sont disponibles que pour le thread correspondant et qu'un autre thread ne peut pas accéder à ces données, cela signifie que les données sont privées pour ce thread et c'est pourquoi nous l'appelons is thread-safe).

Le cadre de la pile est composé de trois parties :

  1. Tableau de variables locales :
    • Il contient tous les arguments (ou paramètres) et les variables locales des méthodes.
    • Chaque bloc du tableau est de 4 octets Les valeurs de int, float et reference n'occupent qu'un seul bloc et double et long occupent deux blocs et octets, short et char seront convertis en int avant le stockage.
  2. Pile d'opérandes :
    • Il s'agit d'une pile pour effectuer des données ou des résultats intermédiaires.
    • Données de trame : Il contient des constantes et une référence à la table des exceptions qui fournissent des informations de bloc catch correspondantes en cas d'exception.

2) Mémoire de tas en Java

  • Mémoire de tas sera créé au démarrage de la JVM.
  • "nouveau" le mot-clé est requis pour la mémoire de tas .
  • Mémoire de tas contient l'objet et l'objet contient des données d'instance (c'est-à-dire que le tas contient des données d'objet et d'instance).
  • Les données stockées dans la mémoire de tas n'est pas thread-safe (c'est-à-dire que l'objet d'un thread sera partagé par un autre thread et que les données ne sont pas privées).
  • Une seule mémoire de tas est autorisé (pas comme la mémoire de la pile) et cette mémoire sera partagée par plusieurs threads.
  • Nous pouvons créer un objet Runtime et une fois que nous avons obtenu l'objet Runtime, nous appelons des méthodes spécifiques à Runtime comme,

Méthodes : maxMemory(), totalMemory(), freeMemory()

Échantillon :

    Runtime r = Runtime.getRuntime();

    r.maxMemory();
    r.totalMemory();
    r.freeMemory();

Explication :

  1. maxMemory() :renvoie le nombre d'octets de mémoire maximale alloués au tas.
  2. totalMemory() :renvoie le nombre d'octets de mémoire totale alloués au tas.
  3. freeMemory() :renvoie le nombre d'octets de mémoire libre présents dans le tas.

Exemple :

class Heap{

	public static void main(String[] args){
		Runtime r = Runtime.getRuntime();
		
		long max_memory = r.maxMemory();
		long total_memory = r.totalMemory();
		long free_memory = r.freeMemory();
		
		System.out.println(" Maximum Memory in bytes " + max_memory);
		System.out.println(" Total Memory in bytes " + total_memory);
		System.out.println(" Free Memory in bytes " + free_memory);
	} 

}

Sortie :

D:\Java Articles>java Heap
Maximum Memory in bytes 1888485376
Total Memory in bytes 128974848
Free Memory in bytes 127611672

Balise Java