Ответ
Sampler (Сэмплер) — это метод профилирования, который периодически (например, каждые 10 мс) "снимает снимки" (сэмплы) стека вызовов всех запущенных потоков приложения. На основе статистики этих снимков строится предположение о том, какие методы потребляют больше всего процессорного времени (CPU).
Принцип работы:
- Профайлер активирует таймер.
- По каждому тику таймера профайлер опрашивает JVM и записывает, в каком методе выполняется каждый поток.
- Методы, которые чаще всего оказываются на вершине стека в моменты сэмплирования, считаются наиболее "горячими" (CPU-intensive).
Где используется? Sampler встроен в большинство Java-профайлеров:
- Java VisualVM / JDK Mission Control: Вкладка "Sampler".
- IntelliJ IDEA Profiler: Режим "Sampling".
- JProfiler, YourKit: Поддерживают режим сэмплирования.
Преимущества Sampler (vs. Instrumentation):
- Низкие накладные расходы (Low Overhead): Не модифицирует байт-код, почти не замедляет работу приложения.
- Безопасность: Подходит для профилирования в production-подобных средах.
- Быстрый старт: Можно подключиться к уже работающему приложению (например, через JMX).
Недостатки и ограничения:
- Статистическая неточность: Результаты — вероятностная оценка, а не точное измерение. Может "пропустить" короткие, но важные методы.
- Проблема с "холодными" методами: Методы, выполняемые редко, могут не попасть в сэмплы.
- Не измеряет аллокации памяти или блокировки ввода-вывода напрямую (для этого нужны другие инструменты).
Пример интерпретации вывода Sampler (как в VisualVM):
Самые потребляющие CPU методы:
1. com.example.App.heavyCalculation() - 45% (попадал в 45% сэмплов)
2. java.util.HashMap.resize() - 22%
3. com.example.App.processData() - 15%
Это говорит о том, что heavyCalculation() — главный кандидат для оптимизации.
Альтернатива: Instrumentation (Трансформация байт-кода) — более точный, но нагружающий метод, когда профайлер вставляет счётчики вызовов и замеры времени в начало и конец каждого метода. Используется, когда нужна максимальная точность, а незначительное замедление допустимо.