Приходилось ли вам анализировать Heap Dump в Java?

«Приходилось ли вам анализировать Heap Dump в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, приходилось. Анализ Heap Dump — ключевой метод диагностики утечек памяти (Memory Leaks) и проблем с потреблением памяти в Java-приложениях.

Инструменты: Eclipse MAT (Memory Analyzer Tool), VisualVM, YourKit.

Типичный процесс анализа:

  1. Снятие дампа (например, с помощью jmap или при падении с флагом -XX:+HeapDumpOnOutOfMemoryError).
  2. Загрузка в анализатор (MAT) для изучения гистограммы объектов, размера retained heap.
  3. Поиск "подозреваемых" (Leak Suspects) — объектов, удерживающих неожиданно большой объем памяти.
  4. Анализ цепочек ссылок (GC Roots) для понимания, почему объекты не собираются сборщиком мусора.

Пример кода, ведущего к утечке:

public class MemoryLeakExample {
    // Статическая коллекция удерживает объекты навсегда
    private static final List<byte[]> LEAKING_CACHE = new ArrayList<>();

    public void processData(String data) {
        // Объекты, добавленные в кэш, никогда не будут удалены GC
        LEAKING_CACHE.add(data.getBytes());
    }
}

В Heap Dump для такого кода MAT покажет, что класс MemoryLeakExample через статическое поле LEAKING_CACHE является доминирующим в удержании памяти.