Ответ
Профайлер (Profiler) — это инструмент для диагностики производительности и потребления ресурсов работающим приложением. Он помогает находить узкие места (bottlenecks), утечки памяти и проблемы с синхронизацией.
Основные типы анализа:
-
Анализ загрузки ЦП (CPU Profiling):
- Показывает, какие методы или строки кода потребляют больше всего процессорного времени.
- Помогает найти "горячие" методы для оптимизации.
-
Анализ памяти (Memory Profiling):
- Отслеживает выделение объектов в Heap.
- Выявляет утечки памяти — объекты, которые не собираются сборщиком мусора (GC), хотя больше не используются.
-
Анализ потоков (Thread Profiling):
- Визуализирует состояние потоков (running, waiting, blocked).
- Помогает обнаружить взаимные блокировки (deadlocks) и состязание за ресурсы (contention).
Пример проблемы, которую можно найти с помощью профайлера:
public class MemoryLeakExample {
private static final List<byte[]> LEAK = new ArrayList<>();
public void processData() {
while (true) {
LEAK.add(new byte[1024 * 1024]); // Утечка: массив добавляется в статическую коллекцию и никогда не удаляется
try { Thread.sleep(100); } catch (InterruptedException e) {}
}
}
}
Профайлер (например, VisualVM или YourKit) покажет постоянный рост потребления памяти (Heap), а анализ снимка памяти (heap dump) укажет на класс MemoryLeakExample и коллекцию LEAK как на корневую причину.
Популярные Java-профайлеры: VisualVM (входит в JDK), JProfiler, YourKit Java Profiler, Async Profiler.