How does the Java Garbage Collector manage memory, and how would you diagnose a memory leak in a production environment?