Ответ
Основные инструменты:
- 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[].