← Назад к вопросам

Какие знаешь интрументы, которые помогают выявить высокое потребление ресурсов приложением?

1.0 Junior🔥 91 комментариев
#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Инструменты для выявления высокого потребления ресурсов приложением

Высокое потребление ресурсов (CPU, RAM, I/O, сеть) критично влияет на производительность и стоимость инфраструктуры. Существует множество инструментов для диагностики и оптимизации.

1. JVM Built-in Tools

jps — список всех Java процессов:

jps -l  # Показывает PID и полное имя класса
jps -v  # Показывает JVM аргументы

# Output:
# 12345 com.example.Application
# 12346 org.apache.catalina.startup.Bootstrap

jstat — статистика JVM в реальном времени:

# Мониторить GC
jstat -gc -h5 12345 1000  # Обновляется каждую секунду

# Output показывает:
# S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT
# Young Generation: S0, S1 (survivor spaces), E (eden)
# Old Generation: O (old)
# Когда EU и OU растут - утечка памяти

# Мониторить потоки
jstat -threads 12345 1000
# Показывает TLC (total live count), peak count, started count

jmap — дамп памяти и информация о heap:

# Получить информацию о heap
jmap -heap 12345
# Показывает size каждого поколения, GC configuration

# Создать dump heap для анализа
jmap -dump:live,format=b,file=heap.bin 12345
# Далее анализируем в Eclipse MAT (Memory Analyzer Tool)

# Histogram объектов
jmap -histo 12345 | head -20
# Output:
# num     #instances  #bytes  class name
#   1:       345678   87654321  [I (int[])
#   2:       234567   45678901  java.lang.String
#   3:       123456   23456789  java.util.HashMap$Node

jstack — dump потоков (полезно для deadlock'ов):

jstack 12345 > threads.txt
# Показывает стек каждого потока
# Ищем:
# - BLOCKED потоки (ждут монитора)
# - WAITING потоки (бесконечное ожидание)
# - Одинаковые стеки = потенциальный deadlock

# Пример:
# "Thread-1" #21 prio=5 os_prio=0 tid=... nid=... runnable
#   at java.net.SocketInputStream.socketRead0()
#   at java.net.SocketInputStream.read()
#   locked <0x00000000xxx> (a java.net.Socket)

2. Java Mission Control & Java Flight Recorder

Java Flight Recorder (JFR) — встроенная профилировка с минимальным overhead (~2%):

# Запуск приложения с JFR
java -XX:+UnlockCommercialFeatures \
     -XX:+FlightRecorder \
     -XX:StartFlightRecording=duration=60s,filename=recording.jfr \
     -jar app.jar

# Или во время выполнения
jcmd 12345 JFR.start duration=120s filename=recording.jfr

# Анализ
jcmd 12345 JFR.stop
jcmd 12345 JFR.dump filename=recording.jfr
# Открыть в JMC (Java Mission Control)

JFR показывает:

  • CPU usage (методы, которые едят CPU)
  • Heap allocations (какие объекты выделяются)
  • GC pauses (время и причины пауз)
  • Thread statistics
  • I/O operations
  • Network activity

3. VisualVM

Бесплатный визуальный мониторинг:

jvisualvm &  # Запустить GUI

Покрывает:

  • Realtime CPU, память, потоки
  • Heap dump и анализ
  • Thread dump
  • Profiling
  • GC visualization

4. Profilers

YourKit Java Profiler (коммерческий, но лучший):

# Профилирование CPU
# Показывает: какие методы едят CPU, сколько вызовов, среднее время

# Профилирование памяти
# Показывает: какие классы выделяют больше всего памяти
# Где происходят allocations

# Лучше всего для найденного bottleneck'а

JProfiler (также коммерческий):

  • Аналогично YourKit
  • Хорошая интеграция с IDE

Async Profiler (open source):

# Компилировать приложение с -XX:+PreserveFramePointer
java -XX:+PreserveFramePointer -jar app.jar

# Профилировать
./profiler.sh -d 30 -f flamegraph.html 12345
# Показывает flame graph — визуализация стека вызовов
# Ширина = сколько времени потрачено на метод

5. Системные инструменты

top — общее потребление ресурсов OS:

top -p 12345  # Мониторить конкретный процесс

# Output:
# PID  USER  PR  NI  VIRT  RES  SHR  %CPU  %MEM
# VIRT = виртуальная память (включая swapped)
# RES = физическая память (RSS)
# %CPU = использование CPU
# %MEM = % от всей памяти системы

ps — снимок процессов:

ps aux | grep java
# USER  PID  %CPU  %MEM  COMMAND
# Быстрая проверка потребления

# Детали памяти
ps -p 12345 -o pid,vsz,rss,comm
# VSZ = виртуальная память
# RSS = физическая память

htop — интерактивный top (удобнее):

htop -p 12345
# Цветной вывод, сортировка, дерево процессов

iostat — I/O статистика:

iostat -x 1  # Обновляется каждую секунду

# Output:
# Device    %util  await  svctm  r/s  w/s  rMB/s  wMB/s
# %util = % использования диска
# await = среднее время очереди I/O
# svctm = время обслуживания одного I/O запроса

strace — трассировка системных вызовов:

strace -c -p 12345  # Подсчитать системные вызовы

# Output:
# % time  seconds  usecs/call  calls   name
# 50.0    0.250000  1000       250     poll
# 30.0    0.150000  50         3000    read
# Показывает где приложение тратит время в ОС

perf (Linux) — performance analysis:

perf record -p 12345 -g sleep 30  # Записать 30 сек
perf report  # Анализ
# Показывает горячие функции (hot spots)

6. Метрики в коде

Micrometer — стандарт для метрик в Spring:

@Service
public class OrderService {
    private final MeterRegistry meterRegistry;
    
    @Autowired
    public OrderService(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }
    
    public void processOrder(Order order) {
        Timer.Sample sample = Timer.start(meterRegistry);
        
        try {
            // Обработка
            
            meterRegistry.counter(
                "orders.processed",
                "status", "success"
            ).increment();
        } catch (Exception e) {
            meterRegistry.counter(
                "orders.processed",
                "status", "failure"
            ).increment();
        } finally {
            sample.stop(Timer.builder("order.processing.time")
                .description("Time to process order")
                .register(meterRegistry));
        }
    }
    
    // Мониторить размер очереди
    @Bean
    public MeterBinder queueMetrics(Queue<Order> queue) {
        return (registry) -> Gauge.builder(
            "queue.size",
            queue::size
        ).register(registry);
    }
}

Prometheus + Grafana для визуализации:

# prometheus.yml
scrape_configs:
  - job_name: 'spring-app'
    static_configs:
      - targets: ['localhost:8080']
    metrics_path: '/actuator/prometheus'

7. JVM Flags для диагностики

# Включить GC логирование
java -Xmx4g \
     -XX:+PrintGCDetails \
     -XX:+PrintGCDateStamps \
     -XX:+PrintGCTimeStamps \
     -Xloggc:gc.log \
     -jar app.jar

# GCEasy анализирует gc.log файл
# https://gceasy.io

# JVM heap dump при OutOfMemoryError
java -Xmx4g \
     -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=./heapdump.bin \
     -jar app.jar

Workflow для диагностики

1. Базовое выявление проблемы:

jps -l                # Найти процесс
htop -p PID           # Смотрим CPU/MEM
jstat -gc -h5 PID    # GC статистика

2. Копание глубже:

jstack PID > threads.txt          # Thread dump
jmap -histo PID | head -30        # Memory histogram
perflock record -p PID -g          # CPU profiling

3. Анализ в инструментах:

jmap -dump:live,format=b,file=heap.bin PID
# Открыть в Eclipse MAT или YourKit

jcmd PID JFR.start duration=120s
# Анализировать в Java Mission Control

Примеры выявления проблем

Высокое CPU usage:

  • Используй YourKit или Async Profiler
  • Найти метод, который вызывается часто
  • Оптимизировать алгоритм или добавить кэширование

Утечка памяти:

  • jstat показывает растущий Old Generation
  • jmap dump -> Eclipse MAT
  • Найти объекты, которые не garbage collected
  • Проверить циклические ссылки

Долгие GC pauses:

  • Проанализировать gc.log
  • Увеличить heap размер (если есть место)
  • Или оптимизировать allocation rate

Знание инструментов диагностики — критический скилл для любого Java разработчика, особенно для high-load систем.