A memory leak in Java occurs when objects are no longer being used by the application, but the Garbage Collector cannot remove them because they are still referenced by other objects (often static ones). Memory keeps accumulating, eventually causing OutOfMemoryError.
How would you identify and debug a memory leak in a production Java application?