Duffymo prawie na pewno ma rację. W przeszłości, kiedy mieliśmy wycieki pamięci, praktycznie ZAWSZE jest to sterownik MySQL JDBC. Po prostu zapomniałem zamknąć gdzieś jeden mały zestaw wyników lub połączenie lub oświadczenie. Skończyło się na kontrolowaniu całej bazy kodu za każdym razem, gdy używaliśmy ich do znalezienia problemu i upewnienia się, że zostaną zamknięte.
Jeśli chodzi o HashMap, też to widziałem. Nie zajrzałem do źródła, ale odniosłem wrażenie, że sterownik MySQL przechowywał wiersze (przynajmniej wartości wierszy) w HashMaps wewnętrznie.
Wyciekanie zestawów wyników jest niestety łatwe. Pomysł, że te zamykalne zasoby, które same się tym zajmują, pojawiają się w JDK 7 lub 8, naprawdę przemawia do mnie z tego powodu.
Możesz wstawić gdzieś klasę podkładki (powiedzmy dla połączenia), aby rejestrować każdy otwarty/zamknięty zasób, aby sprawdzić, czy możesz wykryć, gdzie jest wyciek, bez bezpośredniego czytania całego źródła.