Можно ли обнаружить утечку памяти, анализируя только Stack Trace?

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

Ответ

Можно получить косвенные указания, но этого недостаточно для точной диагностики.

Почему Stack Trace (трассировка стека) ограничен:

  • Он показывает только текущую цепочку вызовов методов, но не отображает объекты в куче (Heap), где и происходят утечки.
  • Он полезен, если утечка связана с "ростом" определенных структур данных (коллекций, кэшей) в конкретных методах.

Пример сценария: Если в логах постоянно встречается один и тот же метод, который добавляет объекты в статическую коллекцию, это может быть признаком утечки.

public class LeakyService {
    private static final List<Data> CACHE = new ArrayList<>(); // Статическая коллекция — риск утечки

    public void processRequest() {
        CACHE.add(new Data()); // Объекты накапливаются и никогда не удаляются
        // Stack Trace этого метода будет часто встречаться в дампах потока
    }
}

Для точного анализа требуются профилировщики:

  • VisualVM, YourKit, Java Mission Control: Для мониторинга кучи в реальном времени.
  • Eclipse MAT (Memory Analyzer Tool): Для анализа дампов памяти (Heap Dump) и поиска "утекающих" объектов и цепочек ссылок.