С какими профилировщиками JVM вы работали?

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

Ответ

Да, работал с профилировщиками для анализа производительности и памяти JVM-приложений, такими как VisualVM, JProfiler и YourKit.

Основные сценарии использования:

  1. Анализ утечек памяти: Поиск объектов, удерживаемых в Heap, и цепочек ссылок, препятствующих сборке мусора.
  2. CPU-профилирование: Выявление "горячих" методов и узких мест в алгоритмах.
  3. Анализ потоков (Threads): Обнаружение deadlock, livelock и избыточного блокирования.

Пример анализа утечки памяти:

import java.util.ArrayList;
import java.util.List;

public class MemoryLeakExample {
    private static final List<Object> LEAKING_LIST = new ArrayList<>();

    public static void main(String[] args) {
        while (true) {
            // Объекты добавляются в статическую коллекцию и никогда не удаляются
            LEAKING_LIST.add(new byte[1024 * 1024]); // Утечка 1 МБ за итерацию
        }
    }
}

В профилировщике (например, JProfiler) можно наблюдать монотонный рост кучи (Old Gen), а с помощью Heap Walker найти LEAKING_LIST как корень утечки.

Best Practice: Профилирование следует проводить под нагрузкой, максимально близкой к production, и сравнивать снимки (snapshots) памяти в разные моменты времени.