Ответ
Для обнаружения утечек памяти в Java используются профилировщики и анализ дампов памяти.
Основные инструменты:
- VisualVM (входит в JDK)
- Eclipse MAT (Memory Analyzer Tool)
- YourKit или JProfiler (коммерческие)
Практические шаги:
- Создание дампа памяти (heap dump) для анализа объектов.
// Программное создание дампа HotSpotDiagnosticMXBean bean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); bean.dumpHeap("heapdump.hprof", true); - Мониторинг через JMX, отслеживая
MemoryPoolMXBeanна предмет постоянного роста. - Использование
ReferenceQueueсWeakReference/SoftReferenceдля отслеживания утечек через ссылки.
Типичные источники утечек:
- Статические коллекции (например,
Map), куда добавляются, но не удаляются объекты. - Незакрытые ресурсы (
InputStream,Connection,Session). - Слушатели событий (Listeners), от которых не отписываются.
- Кэши без политики вытеснения (например, по времени или размеру).