Java >> Tutoriel Java >  >> Java

Java Garbage Collection avec des exemples

Comme nous le savons,
Les objets en Java sont des variables de référence . Ils sont déclarés être de type spécifique et leur type ne peut jamais changer.

Lors de l'écriture d'un programme Java, de nombreux objets sont créés, mais tous les objets ne sont pas réellement utilisés dans le programme. L'Espace Mémoire est alloué à tous ces Objets mais certains d'entre eux ne sont pas utilisés et donc l'espace mémoire doit être rendu disponible pour la création d'autres nouveaux Objets.

C'est là que Garbage Collection entre en jeu.

Lorsqu'un objet est affecté avec null ou qu'il perd sa référence, il incombe alors à Java Runtime Environment (JVM) de marquer l'emplacement de l'objet comme Garbage Collection (GC).

Les machines virtuelles Java créent trois threads lorsque nous exécutons un programme Java.

  1. Fil principal - Il est responsable de l'exécution de la méthode main du programme java.
  2. Fil du planificateur - Il est responsable de la planification du fil.
  3. Fil du Garbage Collector - Il se charge de nettoyer le tas mémoire de l'objet qui a été déréférencé en lui attribuant la valeur null.

Avant de nettoyer la mémoire de l'objet assigné avec null, il appelle la méthode finalize() de cet objet. Après l'exécution de la méthode finalize(), les opérations sous la méthode finalize() sont exécutées et l'objet est détruit.

System.gc();
/* This Method Destroys Location of those Objects which are marked with GC.*/

Remarque : System.gc() suit l'opération basée sur la pile, nous le verrons dans l'exemple à venir.

Publicité

Considérez le programme :

Extrait 1 :

import java.util.Scanner;
class IceCreamParlour
{
	String IceCreamName;
	int IceCreamCost;
	Scanner KB=new Scanner(System.in); 

	void getIceCreamDetails()
	{
		System.out.println("Enter Ice Cream Name : ");
		IceCreamName=KB.nextLine();
		System.out.println("Enter Ice Cream Cost : ");
		IceCreamCost=KB.nextInt();
	}

	void putIceCreamDetails()
	{
		System.out.println("Ice Cream Name :"+IceCreamName);
		System.out.println("Ice Cream Cost :"+IceCreamCost);
	}

	protected void finalize()
	{
		System.out.println("Hope ! finishing the "+IceCreamName+" IceCream worth Rs."+IceCreamCost+"/- was FUN ! :D");
	}
}

class IceCreamCollected
{
	public static void main(String args[])
	{
		IceCreamParlour I1=new IceCreamParlour();
		I1.getIceCreamDetails();
		I1.putIceCreamDetails();
		I1=null;
		System.gc();	
	}
}

Sortie

Enter Ice Cream Name :
Choco
Enter Ice Cream Cost :
50
Ice Cream Name :Choco
Ice Cream Cost :50
Hope ! finishing the Choco IceCream worth Rs.50/- was FUN ! :D
Publicité

Changeons les extraits sous la classe IceCreamCollected

Extrait 2 :

class IceCreamCollected
{
	public static void main(String args[])
	{
		IceCreamParlour I1=new IceCreamParlour();
		I1.getIceCreamDetails();
		I1.putIceCreamDetails();
		IceCreamParlour I2=new IceCreamParlour();
		I2.getIceCreamDetails();
		I2.putIceCreamDetails();
		I1=null; // Takes the bottom position in a Stack
		I2=null; // Takes position right above I1
		System.gc();	
	}
}

Sortie

Enter Ice Cream Name :
Choco
Enter Ice Cream Cost :
50
Ice Cream Name :Choco
Ice Cream Cost :50
Enter Ice Cream Name :
Vanilla
Enter Ice Cream Cost :
100
Ice Cream Name :Vanilla
Ice Cream Cost :100
Hope ! finishing the Vanilla IceCream worth Rs.100/- was FUN ! :D
Hope ! finishing the Choco IceCream worth Rs.50/- was FUN ! :D

Extrait 3 :

class IceCreamCollected
{
	public static void main(String args[])
	{
		IceCreamParlour I1=new IceCreamParlour();
		I1.getIceCreamDetails();
		I1.putIceCreamDetails();
		IceCreamParlour I2=I1;
		I1=null;
		System.gc();	
	}
}

Sortie

Enter Ice Cream Name :
Choco
Enter Ice Cream Cost :
50
Ice Cream Name :Choco
Ice Cream Cost :50

Remarque : Dans l'extrait 3, la méthode finalize() n'a pas été exécutée car l'objet I1 avait une autre référence qui est de I2.


Balise Java