Duffymo hampir pasti benar. Di masa lalu ketika kami mengalami kebocoran memori, itu SELALU driver MySQL JDBC. Hanya lupa untuk menutup satu ResultSet atau Connection atau Statement kecil di suatu tempat. Saya akhirnya mengaudit seluruh basis kode untuk setiap kali kami menggunakannya untuk menemukan masalah dan memastikan mereka ditutup.
Adapun HashMap, saya juga pernah melihatnya. Saya belum melihat sumbernya tetapi kesan saya adalah bahwa driver MySQL menyimpan baris (setidaknya nilai baris) di HashMaps secara internal.
Membocorkan ResultSets sayangnya mudah. Gagasan tentang sumber daya yang dapat ditutup yang menangani ini sendiri datang di JDK 7 atau 8 benar-benar menarik bagi saya karena alasan ini.
Anda dapat memasukkan kelas shim di suatu tempat (misalnya untuk Koneksi) untuk mencatat setiap sumber daya yang dibuka/ditutup untuk melihat apakah Anda dapat mengetahui letak kebocorannya tanpa langsung membaca semua sumber Anda.