True memory leaks are fairly rare these days. Problems usually occur when you shell out to execute a dos command (on windows) and don't read the output and error streams to EOF before closing the process. Another common cause is using the JNI to call native code, which allocates structures on the process's heap, which one then forgets to keep track of.
One other possibilitiy of a memory leak is forgetting to kill threads, or not making them Daemon...
Happened to me once with a very heavy-weight class (name was "World", around 150-210 MB).