My understanding is that Java does not have memory leaks. By memory leak, I mean memory that you cannot access anymore (not memory that you could, but you don't). Here is an example in C: https://en.wikipedia.org/wiki/Memory_leak#A_simple_example_in_C
A friend linked me to these two articles:
A memory leak in java is caused by keeping a reference into a object that you thought you deleted but you left one or more references that provides a path to the object from a root GC (for instance a static object). That means the JVM has to assume that the object might be accessed in the future. It does not know that programmer doesn't need the object anymore.
It's sort of like forgetting to free memory in C/C++. The difference here is that you forgot to remove a reference to it rather than freeing the object itself.
Read more about it here: http://www.w3resource.com/java-tutorial/garbage-collection-in-java.php
You can see examples of memory leaks here: Creating a memory leak with Java