The javadoc says this about System.gc():
gc
public static void gc()
Runs the garbage collector.
Calling the gc method suggests that the
Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.
To me, it seems that all objects are removed as far as possible by the JVM. If you are complaining that this is not so, maybe you have some references that are accessible for the JVM, but have become invisble to you. ;-)
Daniel
SCJP 1.4