Here's a pretty problem. I recently had a memory leak in a java program where one huge object was not collected, even though it "should" have been collected when the whole complex graph of objects that contained it became garbage. (Concretely, the large object is an image, and the complex graph is a window and all the associated structures).
So, barring the unexpected (gc bug) there is some pointer somewhere leaking into the graph containing the image, preventing the whole mess from being collected.
How to find it?