When we have Garbage collection in Java which basically empties space of all unused objects, why there are memory leaks in Java?