After many hours of frustration today, I discovered that the following seems to result in a memory leak.
Logger logger ... (my logger)
StreamHandler handler = new StreamHandler();
It appears that an empty StreamHandler buffers messages unbounded waiting for you to connect an OutputStream. Unsure if this is a bug or a feature.