Java s'occupe de la gestion automatique de l'allocation dynamique de la mémoire. Une zone mémoire est dynamiquement allouée à un objet lors de sa création.

Classe Variable_objet = new Classe();
//Variable_objet représente une référence 
//de l'instance de classe new Classe()

Lorsque cette zone mémoire n'est plus référencée par un objet du programme, elle est automatiquement libérée par le GC.

Variable_objet = null;
//Variable_objet ne référence 
//plus d'instance de classe

Plusieurs objets distincts d'un programme occupent un espace mémoire plus ou moins important sur un système informatique, en sachant que les ressources mémoires sont certainement limitées.
Un usage incontrôlé de la mémoire risque à terme de provoquer des conflits de ressources tels que :

  • une libération intempestive d'une zone allouée (donc utilisée par un objet),
  • une indisponibilité d'une zone désallouée (donc libérée par un objet).

Le système GC interdit l'utilisation d'une ressource déjà utilisée et évite dans la mesure du possible, les pertes de mémoires.

En outre, il existe deux types de perte de mémoire :

  • les hard leaks (fuites mémoires graves) sont provoquées lorsqu'il n'existe pas de système de nettoyage, et partant, aucun référencement des zones mémoires inutilisées qui n'ont pu être libérées,
  • les soft leaks (fuites mémoires légères) surviennent lorsqu'un programme possède des zones mémoires devenues inutilisables car elles n'ont pu être libérées correctement et deviennent, ainsi, irrécupérables pour le programme.

En ce qui concerne les fuites de mémoires légères (soft leaks), il suffit d'affecter la valeur null aux objets qui ne seront plus utilisés par le programme. Ensuite, le système GC détruira les références et libérera les ressources pour une utilisation ultérieure.

import java.io.*;
public class Execution {
  public static void main(String argv[]) {
    new Execution("fichier.bat");
  }

  public Execution(String commande) {
    try {
      String ligne;
      Process processus = Runtime.getRuntime().exec(commande);
      InputStreamReader flux_entree = 
                    new InputStreamReader(processus.getInputStream())
      BufferedReader entree = new BufferedReader();
      while ((ligne = entree.readLine()) != null) {
        System.out.println(ligne);
      }
      ligne = null;
      processus = null;
      flux_entree = null;
      entree = null;
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

fichier.bat
echo "Bonjour à tous et à toutes !"

Le système de Garbage Collector agît essentiellement sur les fuites mémoires graves (hard leaks) en s'occupant de :

  1. la surveillance de l'utilisation des objets,
  2. la détermination des objets devenus inutiles,
  3. l'information des objets sur leur inutilisation,
  4. la destruction des objets inutiles,
  5. la récupération des ressources libérées.