С какими инструментами профилирования Java-приложений вы работали?

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

Ответ

Основные инструменты:

  • VisualVM / JDK Mission Control (JMC): Для базового мониторинга кучи (heap), потоков (threads) и загрузки CPU. Позволяет быстро выявить очевидные проблемы, такие как утечка памяти.
  • JProfiler / YourKit: Для детального профилирования, включая анализ аллокаций объектов, времени выполнения методов (CPU sampling/instrumentation) и блокировок (lock contention).
  • Eclipse Memory Analyzer (MAT): Специализированный инструмент для анализа дампов кучи (heap dumps) и поиска причин утечек памяти (например, через отчет Leak Suspects).
  • async-profiler: Низкоуровневое профилирование с минимальными накладными расходами. Позволяет собирать информацию о CPU (включая нативное время), аллокациях и блокировках.
  • Java Flight Recorder (JFR): Встроенный в JVM профилировщик для сбора детальной диагностической информации в production-среде с минимальным impact. Анализируется в JMC.

Пример сценария:

// Пример кода, приводящего к утечке памяти (удержание ссылок в статической коллекции)
public class MemoryLeakExample {
    private static final List<byte[]> LEAK = new ArrayList<>();

    public void processRequest() {
        // Новые объекты добавляются в статический список и никогда не удаляются
        LEAK.add(new byte[1_000_000]); // Аллокация 1 МБ
    }
}

В VisualVM на графике Heap будет виден постоянный рост потребления памяти, а MAT поможет найти java.util.ArrayList как корневой объект, удерживающий все byte[].