Duffymo heeft vrijwel zeker gelijk. In het verleden, toen we geheugenlekken hadden, is het praktisch ALTIJD de MySQL JDBC-driver. Gewoon vergeten om ergens een kleine ResultSet of Connection of Statement af te sluiten. Ik heb uiteindelijk de hele codebase gecontroleerd voor elke keer dat we die hebben gebruikt om het probleem te vinden en ervoor te zorgen dat ze worden gesloten.
Wat betreft de HashMap, dat heb ik ook gezien. Ik heb niet naar de bron gekeken, maar mijn indruk was dat het MySQL-stuurprogramma de rijen (in ieder geval rijwaarden) intern in HashMaps opsloeg.
Het lekken van ResultSets is helaas eenvoudig. Het idee dat die afsluitbare resources die dit zelf regelen in JDK 7 of 8 komen, spreekt me om deze reden erg aan.
Je zou ergens een shim-klasse kunnen invoegen (bijvoorbeeld voor Connection) om elke geopende/gesloten bron te loggen om te zien of je kunt achterhalen waar het lek zich bevindt zonder direct al je bronnen te lezen.