ca depend ce que tu entends par fuite de memoire.
Le garbage collector va travailler de la facon suivante.
Il part de toutes les references stockees par chaque thread dans sa pile.
Il part de toutes les references stockees dans chaque variable globale (static).
Il va traverser ces objets et noter tous les objets qu'il rencontre recursivement.
Tous ces objets la sont dis "atteignable" et donc ca veut dire qu'ils ne vont pas etre garbage collecte.
Un cas typique de "fuite de memoire" en java vient de l'utilisation de tableau.
Suppose que tu reimplementes ta propre class Vector. Tu vas avoir un tableau quelque part
Object arr[];
et un compteur:
int nbobjet;
qui veut dire que le vecteur contient nbobjet stockes dans arr entre 0 et nbobjet-1.
Maintenant si tu retires le dernier element du tableau, tu vas faire un truc du genre:
nbobjet = nbobjet -1;
Mais l'objet qui est stocke dans arr[nbobjet] reste accessible vu du garbage collector. Donc il ne peut pas virer cet objet la. Cependant l'objet n'est pas accessible par ton application.