La Machine Virtuelle Java (JVM) comptabilise en permanence le nombre de références désignant chaque objet d'un programme. Ainsi, lorsque le nombre de références est égal à zéro, cela signifie que l'objet n'est plus utilisé et par conséquent, que sa zone mémoire doit être libérée.

Le système de Garbage Collector accomplit ses opérations en tâche de fond à partir d'un thread indépendant de faible priorité et en exécution asynchrone.

Le GC conserve la trace de chacun des objets créés et utilisés dans un programme. Que les objets soient accessibles ou inaccessibles, le GC les prend tous en compte.

Lorsqu'une instance de classe en mémoire ne possède plus de lien avec le programme, c'est-à-dire, que plus aucune variable ne référence cet objet, alors ce dernier est jugé inutile. Devenu inaccessible, l'objet peut alors être soumis au traitement du GC, en l'occurrence,il appele, si elle existe, la méthode finalize() de l'objet en question pour accomplir un traitement de finalisation, puis s'il y a lieu opére sa destruction et récupère sa zone mémoire.

Cependant, le processus de Garbage Collector est indéterminable.
Il n'est absolument pas garanti sur tous les objets déréférencés, car le programme peut se terminer avant que le traitement n'ait même commencé.
En effet, étant donné la nature du mode d'exécution du système GC (thread indépendant et exécution asynchrone), il est impossible de prévoir quand le GC s'exécutera, et encore moins, quels objets inaccessibles il traitera.

public class GarbageCollector {
  ProcessusGarbage pG;
  int max;

  public static void main(String[] args) {
    int nb = 275;
    if(args.length > 0)
      nb = (new Integer(args[0])).intValue();
    GarbageCollector oGC = new GarbageCollector(n);
    oGC.executer();
  }

  public GarbageCollector(int nb) {
    max = nb;
  }

  void executer() {
    for(int i = 1; i < max; i++)
      pG = new ProcessusGarbage(i);
  }
}

class ProcessusGarbage {
  double[] tableau;
  int num_objet;

  public ProcessusGarbage(int nb) {
    num_objet = nb;
    tableau = new double[n];
    tableau[0] = 0;
    for(int i = 1; i < n; i++)
      tableau[i] = Math.pow(tableau[i - 1], 1.7E+308);
  }

  protected void finalize() {
    System.out.println("L'objet num" + num_objet 
                      + " a ete traite par le Garbage Collector.");
  }
}

Dans cet exemple, on pourra remarquer que tous les objets créés devenus inaccessibles ne sont pas traités par le GC.

La méthode finalize() est automatiquement appelée lorsque le système GC a déterminé qu'un objet est devenu inaccessible. C'est pourquoi, dans l'exemple précédent, une information à propos du traitement de l'objet a pu être affichée.