Duffymoはほぼ間違いなく正しいです。過去にメモリリークが発生したときは、実質的に常にMySQLJDBCドライバーです。どこかで1つの小さなResultSetまたはConnectionまたはStatementを閉じるのを忘れているだけです。コードベースを使用して問題を見つけ、問題が解決されたことを確認するたびに、コードベース全体を監査することになりました。
HashMapに関しては、私もそれを見ました。ソースを見ていませんが、MySQLドライバーが行(少なくとも行の値)をHashMapsに内部的に格納しているように感じました。
ResultSetsのリークは悲しいことに簡単です。 JDK 7または8で、これ自体を処理するクローズ可能なリソースのアイデアは、この理由で私にとって本当に魅力的です。
どこかにshimクラスを挿入して(たとえばConnectionの場合)、開いた/閉じた各リソースをログに記録して、すべてのソースを直接読み取ることなく、リークがどこにあるかを把握できるかどうかを確認できます。