Профилирование java приложений
Если приложение сжирает слишком много памяти, либо сильно грузит проц, то можно на скорую руку сделать его профилирование.
Ниже представлены команды, которые, при запуске на сервере, могут дать понять — в чём проблема.
Отображение потребления ресурсов потокам
С помощью диспетчера процессов top, можно отобразить список потоков приложения:
top -H -p 20345
где 20345 — это PID запущенного процесса Вашего приложения
Сэмплинг
Помогает найти тормозные методы в приложении. Суть метода заключается в выполнении скоупа нескольких одинаковых запросов. Каждый запрос показывает методы, в которых в данный момент находятся потоки приложения. Таким образом, если в нескольких запросах фигурирует один и тот же метод, то можно предположить, что он является очень долгим и, возможно, требует оптимизации.
Команда для выполнения одного запроса:
jstack 20345 | grep ru.knastnt
где 20345 — это PID запущенного процесса Вашего приложения (можно узнать в диспетчере процессов top),
ru.knastnt — корневое имя всех пакетов в моём приложении. Это нужно чтобы показывать только методы, написанные непосредственно мной. Потому что без grep, будут выведены методы из всех пакетов всех библиотек и фреймворков, которые использует Ваше приложение.
Также есть замечательная статья по использованию jstack, которая описывает, например, как отследить дедлоки или методы сильно загружающие процессор.
Использование памяти
А это способ отследить под что использована память. Команда выведет:
порядковый номер, кол-во инстансов, объём памяти, имя класса
jmap -histo 20345 | more
или
jmap -histo 20345 | grep ru.knastnt
где 20345 — это PID запущенного процесса Вашего приложения (можно узнать в диспетчере процессов top),
ru.knastnt — корневое имя всех пакетов в моём приложении. Это нужно чтобы показывать только объекты, написанные непосредственно мной.
Также можно использовать такую конструкцию для предварительного запуска сборки мусора:
jmap -histo:live 20345 | grep ru.knastnt